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

如何基于EndDate空值条件按人员分组查询匹配数据行

实现思路

  • 用窗口函数ROW_NUMBER()按人员分组(请将示例中的PersonID替换为你表中实际的人员唯一标识字段),给组内每条记录计算排序优先级:
    • 最高优先级:满足EndDate IS NULL AND BillOrder = 1的记录,直接排在组内第一位
    • 次优先级:其余记录按EndDate倒序排列,日期越新排名越靠前
  • 最后筛选每个人员分组内排名为1的记录即可,无需写复杂的嵌套子查询判断是否存在空EndDate的记录

可直接调整使用的SQL示例

WITH ranked_bill AS (
    SELECT 
        bt.ID, 
        bt.PersonID, -- 替换为你实际的人员唯一标识字段
        bt.BillOrder, 
        bt.Description, 
        bt.EndDate,
        ROW_NUMBER() OVER (
            PARTITION BY bt.PersonID -- 按人员维度分组
            ORDER BY 
                CASE WHEN bt.EndDate IS NULL AND bt.BillOrder = 1 THEN 1 ELSE 2 END, -- 优先匹配规则1
                bt.EndDate DESC -- 规则2匹配最新结束日期
        ) AS rn
    FROM BillTable bt
    -- 你原来的其他表关联逻辑可以直接保留在这里
    -- JOIN other_table ot ON bt.关联字段 = ot.关联字段
)
SELECT ID, BillOrder, Description, EndDate
FROM ranked_bill
WHERE rn = 1;

补充说明

  • 如果你使用的是不支持CTE的旧版本数据库,可以把CTE部分改为子查询嵌套实现,逻辑完全一致
  • 若业务场景中存在同一个人员有多条符合规则1的记录,可以在ORDER BY末尾补充bt.ID DESC类的排序规则,取生成时间最晚的记录即可
  • 你原有SQL里的WHERE BillOrder = 1不要直接全局加,否则会过滤掉EndDate最新但BillOrder不为1的记录,不符合规则2的要求

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:15:05