提问人:Thompson 提问时间:9/24/2023 最后编辑:Ken WhiteThompson 更新时间:9/24/2023 访问量:47
select 子句中的 Datediff 仅返回第一行
Datediff in the select clause only returns the first row
问:
对于像这样名为 :Activity
player_id | device_id | event_date | games_played |
---|---|---|---|
1 | 2 | 2016-03-01 | 5 |
1 | 2 | 2016-03-02 | 6 |
2 | 3 | 2017-06-25 | 1 |
3 | 1 | 2016-02-02 | 0 |
3 | 4 | 2018-07-03 | 5 |
我想知道为什么以下查询只返回第一行的结果:
select player_id, datediff(event_date, min(event_date)) as date_diff
from Activity
返回:
player_id | date_diff |
---|---|
1 | 28 |
我本来以为第四行会返回,因为它有最小值,比如event_date
player_id | date_diff |
---|---|
2 | 0 |
答:
0赞
tax evader
9/24/2023
#1
我认为您应该有 3 个单独的查询,一个用于查找整个表中的最小事件日期,一个用于将结果添加为查询结果中的列,最后一个用于计算日期差异select
select player_id, datediff(event_date, min_date) as date_diff from (
select player_id, event_date, (
select min(event_date) from Activity) as min_date from Activity) as query;
从示例数据中,运行查询将获得:
player_id date_diff
1 28
1 29
2 509
3 0
3 882
0赞
Abra
9/24/2023
#2
当我在您的问题中运行查询时,我收到一个错误:
在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列 'fiddle.活动。PLAYER_ID';这与 sql_mode=only_full_group_by 不兼容
min
是一个聚合函数,这就是为什么需要 GROUP BY 的原因。但是,这不会给您带来想要的结果。
为了获得每行的 EVENT_DATE 和最小EVENT_DATE之间的差值,您可以使用单独的 SELECT 作为生成的列。
select PLAYER_ID
,datediff(EVENT_DATE, (select min(EVENT_DATE) from ACTIVITY)) as date_diff
from ACTIVITY
上面的查询返回了以下结果(对于问题中的示例数据):
PLAYER_ID | date_diff |
---|---|
1 | 28 |
1 | 29 |
2 | 509 |
3 | 0 |
3 | 882 |
请参阅此 db<>fiddle
评论