Skip to content

Latest commit

 

History

History
129 lines (102 loc) · 3.54 KB

File metadata and controls

129 lines (102 loc) · 3.54 KB
comments difficulty edit_url tags
true
困难
数据库

English Version

题目描述

表: Orders

+--------------+------+
| Column Name  | Type |
+--------------+------+
| order_id     | int  |
| customer_id  | int  |
| order_date   | date |
| price        | int  |
+--------------+------+
order_id 是该表的主键。
每行包含订单的 id、订购该订单的客户 id、订单日期和价格。

 

编写一个 SQL 查询,报告 总购买量 每年严格增加的客户 id。

  • 客户在一年内的 总购买量 是该年订单价格的总和。如果某一年客户没有下任何订单,我们认为总购买量为 0
  • 对于每个客户,要考虑的第一个年是他们 第一次下单 的年份。
  • 对于每个客户,要考虑的最后一年是他们 最后一次下单 的年份。

以 任意顺序 返回结果表。

查询结果格式如下所示。

 

示例 1:

输入: 
Orders 表:
+----------+-------------+------------+-------+
| order_id | customer_id | order_date | price |
+----------+-------------+------------+-------+
| 1        | 1           | 2019-07-01 | 1100  |
| 2        | 1           | 2019-11-01 | 1200  |
| 3        | 1           | 2020-05-26 | 3000  |
| 4        | 1           | 2021-08-31 | 3100  |
| 5        | 1           | 2022-12-07 | 4700  |
| 6        | 2           | 2015-01-01 | 700   |
| 7        | 2           | 2017-11-07 | 1000  |
| 8        | 3           | 2017-01-01 | 900   |
| 9        | 3           | 2018-11-07 | 900   |
+----------+-------------+------------+-------+
输出: 
+-------------+
| customer_id |
+-------------+
| 1           |
+-------------+
解释: 
客户 1: 第一年是 2019 年,最后一年是 2022 年
  - 2019: 1100 + 1200 = 2300
  - 2020: 3000
  - 2021: 3100
  - 2022: 4700
  我们可以看到总购买量每年都在严格增加,所以我们在答案中包含了客户 1。

客户 2: 第一年是2015年,最后一年是2017年
  - 2015: 700
  - 2016: 0
  - 2017: 1000
  我们没有把客户 2 包括在答案中,因为总的购买量并没有严格地增加。请注意,客户 2 在 2016 年没有购买任何物品。

客户 3: 第一年是 2017 年,最后一年是 2018 年
  - 2017: 900
  - 2018: 900

解法

方法一

MySQL

# Write your MySQL query statement below
SELECT
    customer_id
FROM
    (
        SELECT
            customer_id,
            YEAR(order_date),
            SUM(price) AS total,
            YEAR(order_date) - RANK() OVER (
                PARTITION BY customer_id
                ORDER BY SUM(price)
            ) AS rk
        FROM Orders
        GROUP BY customer_id, YEAR(order_date)
    ) AS t
GROUP BY customer_id
HAVING COUNT(DISTINCT rk) = 1;