Oracle查询时如何省略列中已出现过的重复展示值?
这个需求在Oracle中可以直接实现,不需要修改原有group by逻辑,仅需在外层查询通过窗口函数做显示处理即可,以下是具体实现方案:
实现思路
核心是对分组后的结果按col1、col2排序后,判断当前行col1是否和上一行重复,重复则返回空值,否则返回原值。
方法1:使用LAG分析函数(最简洁)
LAG函数可以直接取排序后上一行的指定字段值,对比后做判断即可:
SELECT CASE WHEN col1 = LAG(col1, 1) OVER (ORDER BY col1, col2) THEN NULL ELSE col1 END AS col1, col2, col3 FROM ( -- 此处替换为你原来的带group by的查询语句 SELECT col1, col2, SUM(col3) AS col3 FROM your_table GROUP BY col1, col2 ) t ORDER BY col1, col2;
注意:LAG函数内的排序规则必须和外层查询的排序规则完全一致,避免出现显示错乱
方法2:使用ROW_NUMBER分析函数
给相同col1的行标记行号,仅行号为1的行显示col1值:
SELECT CASE WHEN rn = 1 THEN col1 ELSE NULL END AS col1, col2, col3 FROM ( SELECT col1, col2, col3, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2) AS rn FROM ( -- 此处替换为你原来的带group by的查询语句 SELECT col1, col2, SUM(col3) AS col3 FROM your_table GROUP BY col1, col2 ) t1 ) t2 ORDER BY col1, col2;
补充说明
这个需求本质是报表展示层的逻辑,如果查询结果是返回给业务应用,更建议把完整的col1值返回给前端,由前端做重复值隐藏处理,灵活性更高。
内容的提问来源于stack exchange,提问作者Daniel Calvo
相关产品推荐
相关产品推荐

