Skip to content

Latest commit

 

History

History
132 lines (100 loc) · 3.37 KB

File metadata and controls

132 lines (100 loc) · 3.37 KB
comments difficulty edit_url tags
true
中等
数据库

English Version

题目描述

表: Orders

+-------------+------+ 
| Column Name | Type | 
+-------------+------+ 
| minute      | int  | 
| order_count | int  |
+-------------+------+
minute 是该表的主键。
该表的每一行包含分钟数以及在特定分钟数内收到的订单数量。总行数将是 6 的倍数。

编写一个查询,计算每个 区间 内的 总订单数量。 每个区间被定义为 6 分钟的组合。

  •  1 到 6 分钟属于第 1 个区间,而 7 到 12 分钟属于第 2 个区间,以此类推。

升序顺序 返回结果表, interval_no 排序。

结果表的格式如下示例所示。

 

示例 1:

输入:
Orders table:
+--------+-------------+
| minute | order_count | 
+--------+-------------+
| 1      | 0           |
| 2      | 2           | 
| 3      | 4           | 
| 4      | 6           | 
| 5      | 1           | 
| 6      | 4           | 
| 7      | 1           | 
| 8      | 2           | 
| 9      | 4           | 
| 10     | 1           | 
| 11     | 4           | 
| 12     | 6           | 
+--------+-------------+
输出:
+-------------+--------------+
| interval_no | total_orders | 
+-------------+--------------+
| 1           | 17           | 
| 2           | 18           |    
+-------------+--------------+
解释:
- 区间号 1 包括从 1 到 6 分钟的时间。这 6 分钟内的总订单数量为 (0 + 2 + 4 + 6 + 1 + 4) = 17。
- 区间号 2 包括从 7 到 12 分钟的时间。这 6 分钟内的总订单数量为 (1 + 2 + 4 + 1 + 4 + 6) = 18。
按升序顺序返回结果表,按 interval_no 排序。

解法

方法一:窗口函数

我们可以用窗口函数 sum() over() 来计算每 $6$ 分钟的订单总数,然后每条记录中的 minute 能被 $6$ 整除的记录。

MySQL

# Write your MySQL query statement below
WITH
    T AS (
        SELECT
            minute,
            SUM(order_count) OVER (
                ORDER BY minute
                ROWS 5 PRECEDING
            ) AS total_orders
        FROM Orders
    )
SELECT minute / 6 AS interval_no, total_orders
FROM T
WHERE minute % 6 = 0;

方法二

MySQL

SELECT
    FLOOR((minute + 5) / 6) AS interval_no,
    SUM(order_count) AS total_orders
FROM Orders
GROUP BY 1
ORDER BY 1;