Oracle如何实现按条件筛选重复标题的有效记录?
解决方案
完全可以通过SQL实现该需求,最简洁的方式是使用窗口函数ROW_NUMBER()实现分组排序筛选,兼容MySQL 8.0+、PostgreSQL、SQL Server等所有支持标准SQL窗口函数的数据库。
具体查询语句
SELECT Record_ID, Title, Status, Activity_Date FROM ( SELECT *, -- 按Title分组,优先排序Active状态,同状态下按活动日期倒序 ROW_NUMBER() OVER ( PARTITION BY Title ORDER BY CASE WHEN Status = 'Active' THEN 1 ELSE 2 END, Activity_Date DESC ) AS rn FROM TITLES WHERE RECORD_ID > 100 -- 保留原有过滤条件 ) t WHERE rn = 1; -- 取每个Title排序后的第一条记录
逻辑说明
PARTITION BY Title:将所有记录按Title字段分组,每个Title单独计算排序序号- 排序规则:
- 第一层用
CASE WHEN给Status设置优先级,Active状态的优先级为1,Inactive为2,确保同一个Title下如果有Active记录会排在最前面 - 第二层按
Activity_Date DESC倒序,确保没有Active记录的分组里,最新日期的Inactive记录排在最前面
- 第一层用
- 最后外层筛选
rn=1即可得到每个Title符合要求的唯一记录
原查询的问题说明
原有查询的子查询关联条件为RECORD_ID = t.RECORD_ID,RECORD_ID是表的唯一主键,这会导致子查询取到的永远是当前行自己的Activity_Date,等于没有做分组聚合,所以才会出现重复的TEST1记录。
如果你的数据库版本不支持窗口函数(比如MySQL 5.x及更低版本),也可以用关联子查询的方式实现:
SELECT t1.* FROM TITLES t1 WHERE t1.RECORD_ID > 100 AND ( -- 条件1:当前记录是Active状态 t1.Status = 'Active' -- 条件2:当前Title下没有Active记录,且当前记录是该Title下最新日期的 OR ( NOT EXISTS (SELECT 1 FROM TITLES t2 WHERE t2.Title = t1.Title AND t2.Status = 'Active') AND t1.Activity_Date = (SELECT MAX(Activity_Date) FROM TITLES t3 WHERE t3.Title = t1.Title) ) );
内容的提问来源于stack exchange,提问作者Coding Duchess
相关产品推荐
相关产品推荐

