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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:47:09