对于像这样名为
Activity
的表:
player_id | 设备ID | 活动日期 | 玩过的游戏 |
---|---|---|---|
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 | 日期_差异 |
---|---|
1 | 28 |
我期待第四行会被返回,因为它具有最小值
event_date
,类似
player_id | 日期_差异 |
---|---|
2 | 0 |
我认为你应该有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
当我在您的问题中运行查询时,出现错误:
在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列 'fiddle.ACTIVITY.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 | 日期_差异 |
---|---|
1 | 28 |
1 | 29 |
2 | 509 |
3 | 0 |
3 | 882 |
参考这个db<>fiddle