我必须计算将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
答案 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;