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

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单独计算排序序号
  • 排序规则:
    1. 第一层用CASE WHEN给Status设置优先级,Active状态的优先级为1,Inactive为2,确保同一个Title下如果有Active记录会排在最前面
    2. 第二层按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:45:03