题目
假设你在Uber工作。rides
表包含了关于Uber用户在美国各地的行程信息。
编写一个查询,以获取纽约(NY)每位通勤者的平均通勤时间(以分钟为单位),以及纽约所有通勤者的平均通勤时间(以分钟为单位)。
示例:
输入:
rides
表
列名 | 类型 |
---|---|
id | INTEGER |
commuter_id | INTEGER |
start_dt | DATETIME |
end_dt | DATETIME |
city | VARCHAR |
输出:
列名 | 类型 |
---|---|
commuter_id | INTEGER |
avg_commuter_time | FLOAT |
avg_time | FLOAT |
结果显示如下:
commuter_id | avg_commuter_time | avg_time |
---|---|---|
11 | 27 | 45 |
22 | 97 | 45 |
33 | 11 | 45 |
答案
解题思路
一般思路是,先计算纽约的平均通勤时间,然后再计算个人的,最后把结果汇总在一起。
其实,直接用窗口函数可以直接得出结果。
答案代码
下面是直接用一个窗口函数,完成对每个ID的平均值计算。
SELECT DISTINCT
commuter_id
,FLOOR(AVG(TIMESTAMPDIFF(MINUTE,start_dt,end_dt)) OVER (PARTITION BY commuter_id)) avg_commuter_time
,FLOOR(AVG(TIMESTAMPDIFF(MINUTE,start_dt,end_dt)) OVER ()) avg_time
FROM rides
WHERE city = 'NY'
FLOOR()
: 用于向下取整,将平均值舍入到最接近的整数。TIMESTAMPDIFF()
: 用于计算两个时间戳之间的差值,单位为分钟。AVG( ) OVER (PARTITION BY commuter_id)
: 用于对每个commuter_id
进行分组,并计算每个分组的平均值。AVG() OVER ():
OVER ()`表示在整个数据集上进行计算
计算时间差的函数
TIMESTAMPDIFF()
TIMESTAMPDIFF(unit, start_datetime, end_datetime)
是一个用于计算两个日期时间之间差异的 MySQL 函数。它接受三个参数:时间单位、起始日期时间和结束日期时间。
在我们的答案中就用了TIMESTAMPDIFF(MINUTE, start_dt, end_dt)
TIMESTAMPDIFF` 函数的时间单位参数可以是以下之一:
MICROSECOND
: 微秒SECOND
: 秒MINUTE
: 分钟HOUR
: 小时DAY
: 天WEEK
: 周MONTH
: 月QUARTER
: 季度YEAR
: 年
DATEDIFF()
DATEDIFF(date1, date2)
: 这个函数返回两个日期之间的天数差异。它接受两个日期参数,并返回 date2
减去 date1
的天数差异。
TIMESTAMPDIFF() 可以用来计算date 格式吗?
TIMESTAMPDIFF()
函数通常用于计算两个日期时间之间的差异,因此它的参数通常是 DATETIME
或 TIMESTAMP
类型的数据。虽然可以接受 DATE
类型的数据作为参数,但是在处理时会将 DATE
类型的数据隐式转换为 DATETIME
类型,并将时间部分视为零值。
举个例子,如果你要计算两个日期之间的差异:
SELECT TIMESTAMPDIFF(DAY, '2022-01-01', '2022-01-05');
这将返回 4
,表示 ‘2022-01-01’ 到 ‘2022-01-05’ 之间相隔 4 天。
虽然 TIMESTAMPDIFF()
可以处理 DATE
类型的参数,但是如果只是想计算日期之间的天数差异,使用 DATEDIFF()
更为简单和直观。