Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用行分区内的筛选器进行筛选和排序(使用行分区)_Sql_Postgresql_Datetime_Gaps And Islands - Fatal编程技术网

Sql 使用行分区内的筛选器进行筛选和排序(使用行分区)

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,

我有一个表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,
        --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语句吗?还有,有没有可能修补一下,将实际完成的工作也包括在结果中?