使用Oracle SQL按分组查询最近完成任务的问题求助
Oracle SQL分组查询每组最近完成任务解决方案
核心问题出在你定义的ROW_NUMBER()窗口排序规则不符合业务要求,只需要调整窗口函数的排序条件即可,不需要修改其他过滤逻辑。
修改后完整SQL
select proj_company_name, custom_lot_no, task_name, task_actual_end_date, task_finish_date, task_finished, task_last_modified_date, to_char(task_last_modified_date, 'YYYY-MM-DD hh24:mi:ss') AS TASK_LAST_MODIFIED_DATE_TIME, -- 核心修改:调整排序规则,已完成任务优先,同状态按修改时间倒序 ROW_NUMBER() OVER (PARTITION BY custom_lot_no ORDER BY task_finished DESC, task_last_modified_date DESC) AS LAST_TASK_FINISH_SEQ, po_total_amount, po_status, CASE WHEN po_status = 101 THEN po_total_amount ELSE 0 END as POs_COMPLETED, po_type, CASE WHEN po_type = 100 THEN po_total_amount ELSE 0 END as "COMMITTED" FROM project_complete_data where project_id = 511 AND po_status in ('100', '101') AND lot_status in ('102', '103') And task_status = 101 AND ( (construction_type = 0 AND task_finished = 1 and (schedule_task_id is not null or schedule_task_id > 0)) OR (construction_type in ('1', '2') AND task_finished in ('1', '0')) ) -- 外层排序同步调整,和窗口排序逻辑一致 order by custom_lot_no, task_finished DESC, task_last_modified_date DESC;
修改说明
- 调整
ROW_NUMBER()窗口函数的排序规则:优先按task_finished DESC排序,将已完成(值为1)的任务排在最前,同状态下再按task_last_modified_date DESC倒序,取最新修改的任务 - 去掉了无意义的
to_char()转换:日期类型字段可以直接排序,转字符串不会提升排序准确性,反而会增加性能开销 - 外层查询的排序规则同步和窗口排序逻辑对齐,保证结果展示符合预期
效果验证
针对你提供的测试数据,修改后custom_lot_no = '0000000077'分组的LAST_TASK_FINISH_SEQ = 1的任务为已完成的plumbing rough,而非未完成的electrical rough,符合业务要求,后续直接套子查询过滤LAST_TASK_FINISH_SEQ = 1即可得到每组最近完成的任务。
内容的提问来源于stack exchange,提问作者Basit
相关产品推荐
相关产品推荐

