Oracle SQL技术问询:按activity+r_system组合取最新end_date全列数据
Oracle SQL:按activity与r_system组合选取组内end_date最新的数据
原SQL存在的问题
- WHERE子句中多条件不能用逗号分隔,Oracle SQL要求用
AND连接 - EXISTS子查询里的
SELECT DISTINCT和ORDER BY完全多余:EXISTS仅判断子查询是否有结果返回,不需要指定具体列;ORDER BY在EXISTS子查询中不影响判断逻辑 - 子查询逻辑错误:没有正确筛选出每组(activity + r_system)的最大end_date,无法和主查询的记录建立有效关联
正确解决方案
方法1:窗口函数ROW_NUMBER()(推荐,逻辑直观)
适合只保留每组内最新的一条记录(若同一组有多个相同最大end_date,仅取第一条);如果要保留所有相同最大日期的记录,替换ROW_NUMBER()为RANK()或DENSE_RANK()即可。
SELECT * FROM ( SELECT h.*, ROW_NUMBER() OVER (PARTITION BY activity, r_system ORDER BY end_date DESC) AS rn FROM happy h ) t WHERE rn = 1;
方法2:关联子查询
自动保留同一组内所有end_date等于最大值的记录:
SELECT h1.* FROM happy h1 WHERE h1.end_date = ( SELECT MAX(h2.end_date) FROM happy h2 WHERE h2.activity = h1.activity AND h2.r_system = h1.r_system );
方法3:KEEP聚合语法(适合分组聚合场景)
当需要按activity和r_system分组,同时获取最新end_date对应的其他列值时使用:
SELECT activity, r_system, MAX(end_date) AS end_date, MAX(col1) KEEP (DENSE_RANK LAST ORDER BY end_date) AS col1, MAX(col2) KEEP (DENSE_RANK LAST ORDER BY end_date) AS col2 -- 依次替换为表中实际需要的列名 FROM happy GROUP BY activity, r_system;
内容的提问来源于stack exchange,提问作者user21755023
相关产品推荐
相关产品推荐

