【发布时间】:2020-12-22 21:56:48
【问题描述】:
我有一个表 Jobs,其中存储了来自 *Users 帖子的每个用户的一堆工作。每个作业都有一个状态。我的第一个目标是为每个用户确定第一个已完成(状态 = 已完成)的作业。我能够这样做:
SELECT
user_id AS user_id,
starts_time AS starts_time,
id AS job_id
FROM (
SELECT
user_id,
starts_time,
id,
--sort by starts time, and rank ascending
Row_number() OVER (PARTITION BY User_id ORDER BY Starts_time ASC) AS Rn
FROM
jobs
WHERE
--status 2 is completed
status = 2
GROUP BY
user_id,
assignment_id,
id ORDER BY
user_id) AS jobs
WHERE
rn = 1
这是它返回的内容:
user_id | starts_time | job_id |
-----------------------------------------------
123 | 2016-04-18 14:30:00+00 | 1292 |
124 | 2016-04-18 19:00:00+00 | 2389 |
128 | 2016-04-16 13:00:00+00 | 3201 |
就像某些上下文一样,在很多情况下,用户的第一份工作不是状态为“已完成”的工作。例如,他们会在看到已完成的工作之前发布具有以下任何一种状态的工作列表:(“未完成”、“作废”、“已取消”)
对于每个用户,我想确定在该用户看到他们第一个完成的工作之前有哪些工作。我希望上面的查询将是一个起点,从那我可以说,为每个用户在 第一个工作完成之前有 starts_time 的用户返回任何工作>
*对不起,如果这令人困惑,这是我第一次在 Stack Overflow 上发帖寻求帮助,欢迎任何建设性的批评!
【问题讨论】:
标签: sql postgresql datetime gaps-and-islands