无法在SQL中为同一user_id的所有行获得相同的Min(日期)

时间:2019-05-04 06:40:25

标签: mysql sql looker

我有4列,分别是:

user_id,
job_date,
min(job_date),
排名。

不显示我想要的列是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;

该表如下所示: enter image description here

问题:2019-04-29T13:24的min_job_date只显示在第一行,但应该显示同一user_id的所有行。我究竟做错了什么? 预先感谢!

3 个答案:

答案 0 :(得分:1)

您可以只使用相同的窗口函数(尽管不需要ORDER BY)来确定每个用户的MIN(job_date)。正如@GordonLinoff所指出的那样,使用窗口函数,现在可能没有必要使用GROUP BY,除非给定的用户可以从给定的job_date开始执行多个任务。 / p>

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;

答案 1 :(得分:1)

您尚未显示数据,但是您是否真的需要汇总?也就是说,给定用户在给定日期是否存在重复的行?还是std::vector只是您尝试获得最低要求的方法。

我怀疑是后者,所以这可能会满足您的要求:

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(),因为假设没有重复。

答案 2 :(得分: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;