sql - 具有最大日期和多个条件的 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
解决方案
您可以使用子查询获取任务的记录计数,状态在哪里,'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;
推荐阅读
- javascript - 在 Chrome pdf 查看器中打开后无法下载 pdf
- database - 网络存储的争论
- javascript - Jenkins 与 JestJS 的集成
- ios - Flutter Google Maps 插件在 iOS 上无法正常工作
- selenium-ide - 如何在 Chrome 上修复 Katalon Recorder
- apache2 - .htaccess 在默认 apache2 目录的子目录中
- python - 如何递归输出给定长度的0和1的排列?
- postgresql - 如何知道 Postgresql 服务器在什么操作系统/平台上运行?
- augmented-reality - AR.js:增加稳定性的多个标记?
- javascript - 设置默认单选输入和相应的复选框