SQL查询结果表如何仅展示同值的首个值 其余同值位置留空
实现SQL查询同值列仅首行显示的方案
核心实现思路:判断同分组内的首行,首行返回原值,其余行返回空值即可实现需求,以下是不同场景的实现方案:
方案1:支持窗口函数的主流数据库(MySQL8.0+/PostgreSQL/SQL Server/Oracle等通用)
LAG函数写法(更简洁)
SELECT Id, -- 对比当前行与上一行的Type值,相同则返回空,不同则返回当前Type CASE WHEN LAG(Type) OVER (ORDER BY Id) = Type THEN '' ELSE Type END AS Type FROM 你的原查询结果集
ROW_NUMBER写法(兼容性更稳定)
SELECT Id, -- 按Type分组,组内按Id排序,仅组内第一行返回Type值 CASE WHEN ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Id) = 1 THEN Type ELSE '' END AS Type FROM 你的原查询结果集
方案2:不支持窗口函数的旧版本数据库(以MySQL5.x为例)
通过自定义变量实现:
SELECT Id, Type FROM ( SELECT t.Id, CASE WHEN @prev_type = t.Type THEN '' ELSE t.Type END AS Type, @prev_type := t.Type FROM ( -- 替换为你原本的查询语句,必须保证结果按Id、Type有序 SELECT Id, Type FROM 你的业务表 ORDER BY Id ) t, (SELECT @prev_type := '') AS init_vars ) AS final_result
注意事项
- 所有方案的前提是你的查询结果已经按Id和Type有序排列,和示例的排序规则一致
- 如果仅为前端/报表展示需求,更建议在应用层/报表工具中实现该逻辑,避免SQL层处理后影响Type列的后续聚合、过滤操作
内容的提问来源于stack exchange,提问作者LewoSoft
相关产品推荐
相关产品推荐

