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

Oracle中如何修改LISTAGG查询以排除最新的首行值?

修改LISTAGG查询以排除最新值并满足指定条件

最终查询语句

WITH ranked_records AS (
    SELECT 
        t.id,
        t.value,
        t.created_date,
        ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.created_date DESC) AS rn,
        COUNT(DISTINCT t.value) OVER (PARTITION BY t.id) AS distinct_val_count
    FROM MY_TABLE t
    WHERE t.id = ?
)
SELECT 
    CASE 
        WHEN distinct_val_count <= 1 THEN NULL
        ELSE LISTAGG(DISTINCT value, ' - ') WITHIN GROUP (ORDER BY created_date DESC)
    END AS aggregated_values
FROM ranked_records
WHERE rn > 1
GROUP BY id, distinct_val_count;

逻辑说明

  • CTE ranked_records:
    • 用ROW_NUMBER()给每个ID下的记录按created_date降序编号,最新记录编号为1,后续记录编号依次递增。
    • 用COUNT(DISTINCT value) OVER (PARTITION BY t.id)统计当前ID下所有不同值的数量,用于判断是否所有值完全相同。
  • 主查询:
    • 通过WHERE rn > 1过滤掉最新的那条记录。
    • 用CASE分支处理:如果该ID下不同值数量≤1(包含仅1条记录、所有值相同两种场景),直接返回NULL;否则对剩余的不同值执行LISTAGG拼接。
    • 按id和distinct_val_count分组,保证分组逻辑的正确性。

条件匹配验证

  • 存在2条记录时:若两个值不同,过滤后剩余1条记录,返回该值;若两个值相同,distinct_val_count=1,返回NULL(符合所有值相同的要求)。
  • 仅1条记录时:rn>1无匹配结果,最终返回NULL。
  • 所有值均相同时:distinct_val_count=1,直接返回NULL。

内容的提问来源于stack exchange,提问作者armandino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:02:05