PostgreSQL中保留原序列去除group列重复值的需求
需求说明
现有数据库表数据如下:
| group | account | description | balance | balance1 | +----------+-------------+-----------------+-------------+--------------+ | 123123 | 0 | Name 1 | 1000.00 | 0 | | 123123 | 777 | Name 2 | 250.00 | 0 | | 123123 | 999 | Name 3 | 0 | 350.00 | | 123000 | 0 | Name 4 | 500.00 | 0 | | 123000 | 567 | Name 5 | 0 | 500.00 |
执行select * from table;得到上述结果,要求不使用GROUP BY和ORDER BY,保留原有输出顺序,仅在group列值首次出现时显示,后续重复项留空,其他列数据和顺序保持不变,期望结果:
| group | account | description | balance | balance1 | +----------+-------------+-----------------+-------------+--------------+ | 123123 | 0 | Name 1 | 1000.00 | 0 | | | 777 | Name 2 | 250.00 | 0 | | | 999 | Name 3 | 0 | 350.00 | | 123000 | 0 | Name 4 | 500.00 | 0 | | | 567 | Name 5 | 0 | 500.00 |
解决方案
核心是通过对比当前行与前一行的group值,判断是否显示该值,全程不改变原有数据顺序。
支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等)
使用LAG()窗口函数获取前一行的group值,结合条件判断实现空值替换:
SELECT CASE WHEN LAG(`group`) OVER () = `group` THEN '' ELSE `group` END AS `group`, account, description, balance, balance1 FROM your_table_name;
提示:
group是SQL关键字,需用反引号(MySQL)或双引号(PostgreSQL/SQL Server)包裹,避免语法错误。
不支持窗口函数的数据库(如MySQL 5.x)
用用户变量逐行对比并更新,实现需求:
SELECT CASE WHEN @prev_group = `group` THEN '' ELSE @prev_group := `group` END AS `group`, account, description, balance, balance1 FROM your_table_name, (SELECT @prev_group := NULL) AS init_var;
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

