select 子句中的 Datediff 仅返回第一行

Datediff in the select clause only returns the first row

提问人:Thompson 提问时间:9/24/2023 最后编辑:Ken WhiteThompson 更新时间:9/24/2023 访问量:47

问:

对于像这样名为 :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
mysql 日期差异

评论

0赞 Soheb 9/24/2023
您是否也使用 Select 子句传递player_id?
0赞 P.Salmon 9/24/2023
“没有 GROUP BY,就只有一个组,它是不确定的......”dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

答:

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