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