如何用SQL SELECT语句去除分组内连续重复行并输出结果?
解决方案:去除分组内连续重复的Column B记录
要实现按ColumnID分组、组内按Column A排序,且仅保留每组内Column B首次出现的行(过滤连续重复项),可以借助窗口函数LAG()来实现,以下是通用SQL写法:
SELECT Column_A, Column_B FROM ( SELECT ColumnID, Column_A, Column_B, -- 同组内按Column_A排序,获取上一行的Column_B值 LAG(Column_B) OVER (PARTITION BY ColumnID ORDER BY Column_A) AS prev_B FROM xyz ) AS sub -- 保留组内第一行,或当前行B与上一行不同的记录 WHERE prev_B IS NULL OR Column_B != prev_B -- 按原分组和排序规则输出结果 ORDER BY ColumnID, Column_A;
逻辑说明
- 子查询处理:通过
PARTITION BY ColumnID将数据按ColumnID分组,ORDER BY Column_A保证组内数据按Column A排序;LAG()函数用于获取当前行在组内的上一行Column B值,命名为prev_B。 - 过滤重复项:外层查询中,
prev_B IS NULL对应每组的第一行(无前置行,必须保留);Column_B != prev_B筛选出与上一行Column B不同的记录,自动过滤掉连续重复的行。 - 排序输出:最后通过
ORDER BY ColumnID, Column_A确保结果顺序和需求一致。
这个写法适用于大多数支持窗口函数的数据库(如MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)。
内容的提问来源于stack exchange,提问作者confusedprogrammer
相关产品推荐
相关产品推荐

