如何基于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
相关产品推荐
相关产品推荐

