如何通过SQL删除Values列的连续重复组值对应的行?
解决连续重复组的SQL查询方案
要实现只保留Values列每个连续重复组的第一条记录,可通过**窗口函数LAG()**来实现,具体方案如下:
核心SQL语句
假设你的表名为your_table,执行以下查询:
SELECT Id, `Values` FROM ( SELECT Id, `Values`, -- 获取当前行的上一行Values值,按Id排序保证顺序 LAG(`Values`) OVER (ORDER BY Id) AS prev_value FROM your_table ) AS sub_query -- 筛选:第一行(无前置行) 或 当前行Values与上一行不同 WHERE prev_value IS NULL OR `Values` != prev_value;
逻辑说明
LAG()函数:按Id排序后,为每一行获取它前一行的Values值,命名为prev_value- 筛选条件:
prev_value IS NULL:保留表中的第一行(没有前一行数据)Values != prev_value:保留当前行与前一行Values不同的记录,也就是每个连续重复组的第一条
为什么GROUP BY/DISTINCT/普通ROW_NUMBER()不行?
GROUP BY/DISTINCT会直接去重所有重复的Values值,无法保留非连续的重复项(比如原表中第1行、第4行、第8行的A都需要保留)- 单纯的
ROW_NUMBER() OVER (PARTITION BY Values ORDER BY Id)只能给每个Values分组加序号,但无法区分连续的重复组,无法筛选出连续组的第一条
内容的提问来源于stack exchange,提问作者ecerutti
相关产品推荐
相关产品推荐

