Sql 使用行分区内的筛选器进行筛选和排序(使用行分区)
我有一个表Jobs,它存储了*Users帖子中每个用户的一组作业。每个作业都有一个状态。我的第一个目标是为每个用户识别第一个已完成(status=completed)的作业。我可以通过以下方式实现:Sql 使用行分区内的筛选器进行筛选和排序(使用行分区),sql,postgresql,datetime,gaps-and-islands,Sql,Postgresql,Datetime,Gaps And Islands,我有一个表Jobs,它存储了*Users帖子中每个用户的一组作业。每个作业都有一个状态。我的第一个目标是为每个用户识别第一个已完成(status=completed)的作业。我可以通过以下方式实现: SELECT user_id AS user_id, starts_time AS starts_time, id AS job_id FROM ( SELECT user_id, starts_time, id,
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 |
与某些上下文一样,在很多情况下,用户的第一个作业不是状态为“已完成”的作业。例如,他们将发布一个在看到已完成作业之前状态为“未完成”、“已作废”、“已取消”的作业列表:
对于每个用户,我想确定哪些作业在该用户看到其第一个完成的作业之前出现。我希望上面的查询将是一个起点,因此我可以说,为每个用户返回任何作业,这些作业的开始时间早于完成的第一个作业的开始时间
*很抱歉,如果这是混乱,这是我第一次张贴帮助堆栈溢出,任何建设性的批评是感激的
对于每个用户,我想确定哪些作业在该用户看到其第一个完成的作业之前出现
对于每个用户,您希望所有记录的第一个状态为“2”。您可以使用窗口功能:
select *
from (
select j.*,
bool_or(status = 2) over(partition by user_id order by starts_time) as flag
from jobs j
) t
where not flag
bool\u或
检查当前行或任何前一行是否满足条件
如果您想保留第一个状态2,那么您可以只更改窗口函数的<代码>())/Cuth>子句,不考虑当前行:
select *
from (
select j.*,
bool_or(status = 2) over(
partition by user_id
order by starts_time rows between unbounded preceding and 1 preceding
) as flag
from jobs j
) t
where flag is distinct from true
哇,这真是太棒了,谢谢你,我很感激!!您是否愿意简要解释一下窗口函数在这种情况下是如何工作的?这像是某种If语句吗?还有,有没有可能修补一下,将实际完成的工作也包括在结果中?