1

我有 4 列,它们是:

user_id、
job_date、
min(job_date)、
rank。

没有显示我想要的列是 min(job_date) 列。在该列中,我基本上是在尝试粘贴给定 user_id 的最小日期。即如果我的第一个日期是 1-1-19,那么这个日期将显示在 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 的所有行。我究竟做错了什么?提前致谢!

4

3 回答 3

1

您可以只使用相同的窗口功能(尽管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;
于 2019-05-04T07:08:39.323 回答
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()因为假设没有重复。

于 2019-05-04T11:22:40.957 回答
0

问题是您同时按 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;
于 2019-05-04T06:48:54.163 回答