【问题标题】:Cannot get the same Min(date) for all rows for the same user_id in SQL无法为 SQL 中相同 user_id 的所有行获取相同的 Min(date)
【发布时间】:2019-05-04 06:40:25
【问题描述】:

我有 4 列:

用户 ID,
工作日期,
分钟(工作日期),
排名。

没有显示我想要的列是 min(job_date) 列。在该列中,我基本上是在尝试粘贴给定 user_id 的最小日期。 IE。如果我的第一个日期是 19 年 1 月 1 日,那么这个日期将显示在 min(job_date) 列的所有列中。

下面是 SQL 代码:

SELECT  
user_id , 
job_date,
min(job_date),
rank() over(PARTITION BY user_id ORDER BY job_date ASC) AS rank
FROM abc
group by 1,2;

表格如下所示:

问题:2019-04-29T13:24 的 min_job_date 仅显示第一行,但它应该显示相同 user_id 的所有行。我究竟做错了什么? 提前致谢!

【问题讨论】:

    标签: mysql sql looker


    【解决方案1】:

    您还没有显示您的数据,但您真的需要聚合吗?也就是说,给定日期的给定用户是否有重复的行?或者GROUP BY 只是您试图获得最低限度的结果。

    我怀疑是后者,所以这可能会做你想做的事:

    SELECT user_id, job_date,
           MIN(job_date) OVER (PARTITION BY user_id) as min_job_date,
           ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY job_date ASC) AS seqnum
    FROM abc;
    

    我将RANK() 替换为ROW_NUMBER(),因为假设没有重复。

    【讨论】:

    • 您对聚合的需求是正确的。鉴于使用了窗口函数,此查询没有必要。这不会造成伤害,但绝对不需要。
    【解决方案2】:

    您可以只使用相同的窗口函数(尽管ORDER BY 不是必需的)来确定每个用户的MIN(job_date)。正如@GordonLinoff 所指出的,通过使用窗口函数,现在可能没有必要使用GROUP BY,除非给定的用户可以从给定的job_date 开始拥有多个工作。

    SELECT user_id , 
           job_date,
           MIN(job_date) over (PARTITION BY user_id) AS min_job_date,
           RANK() over(PARTITION BY user_id ORDER BY job_date ASC) AS `rank`
    FROM abc
    GROUP BY 1,2;
    

    【讨论】:

    • 。 .具有讽刺意味的是,这也将(发生)与相同的 ORDER BY 子句一起使用,但您的版本绝对是表达逻辑的正确方式。
    【解决方案3】:

    问题是您同时按 user_id 和 job_date 进行分组,因此您获得每个 job_date 的最小 job_date...切换到 group by 1

    但是,仅此一项将仅返回每个用户的最小 job_date,如果您想获得所有行的最小列,则需要将其加入结果集:

    SELECT  
    abc.user_id , 
    job_date,
    min_job_date,
    rank() over(PARTITION BY abc.user_id ORDER BY job_date ASC) AS rank
    FROM abc inner join (
      select user_id, min(job_date) as min_job_date 
      from abc group by user_id
    ) mjd on abc.user_id = mjd.user_id;
    

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 2020-09-06
      • 2023-02-07
      • 2017-01-29
      • 1970-01-01
      相关资源
      最近更新 更多