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

问题描述 投票:0回答:2

对于像这样名为

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
mysql datediff
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

0
投票

当我在您的问题中运行查询时,出现错误:

在没有 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

© www.soinside.com 2019 - 2024. All rights reserved.