具有最大日期和多个条件的SQL查询

时间:2018-09-30 14:21:53

标签: sql postgresql case

我必须计算将task_status设置为“ FULFILLED”的所有订单。如果一个订单为“成功”或五个状态为“ ATTEMPT”的订单,则将特定任务设置为“ FULFILLED”。我写了一个查询,使用最大日期选择正确的订单。我的问题是,尽管实际原因是一个“成功”订单,但该查询有时会将一个“ ATTEMPT”(由于表中显示的日期相同)计为“完成”任务的原因。我需要一个查询,该查询更喜欢订单中的“成功”状态(如果存在)而不是“ ATTEMPT”状态。

感谢您的帮助和建议!

这是我当前的查询,也是两个日期相似的订单的示例:

select *,
    case 
        when task_status = 'FULFILLED' and status = 'SUCCESS' and max(date) then '999'
        when task_status = 'FULFILLED' and status = 'ATTEMPT' and max(date) then '999'
        else '000'
    end as number
    from table
    group by task_id
    ;


   task_id  order   task_status status  date
    372     121     FULFILLED   INVALID 2018/06/26
    372     132     FULFILLED   ATTEMPT 2018/07/04
    372     145     FULFILLED   SUCCESS 2018/07/04

1 个答案:

答案 0 :(得分:1)

您可以使用子查询获取状态为'ATTEMPT'的任务的记录数,并检查其是否至少为5。要以正确的顺序选择记录,请使用row_number()。首先按status降序排列(因为'SUCCESS' > 'ATTEMPT'),然后按日期也降序排列。在外部SELECT中,仅获得行号为1的记录。

SELECT x.task_id,
       x.order,
       x.task_status,
       x.status,
       x.date
       FROM (SELECT t1.task_id,
                    t1.order,
                    t1.task_status,
                    t1.status,
                    t1.date,
                    row_number() OVER (PARTITION BY t1.task_id
                                       ORDER BY t1.status DESC,
                                                t1.date DESC) rn
                    FROM table t1
                    WHERE t1.task_status = 'FULFILLED'
                          AND (t1.status = 'SUCCESS'
                                OR t1.status = 'ATTEMPT'
                                   AND (SELECT count(*)
                                               FROM table t2
                                               WHERE t2.task_id = t1.task_id
                                                     AND t2.tast_status = t1.task_status
                                                     AND t2.status = t1.status) >= 5)) x
       WHERE x.rn = 1;