首页 > 解决方案 > 具有最大日期和多个条件的 SQL 查询

问题描述

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

感谢您的帮助和建议!

这是我当前的查询和两个具有相似日期的订单的示例:

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

标签: sqlpostgresqlcase

解决方案


您可以使用子查询获取任务的记录计数,状态在哪里,'ATTEMPT'并检查它是否至少为五个。要以正确的顺序选择记录,请使用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;

推荐阅读