You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:04