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
相关产品推荐
相关产品推荐

