SQL查询表中某列连续出现至少4次的对应值的实现方法
错误原因分析
你编写的SQL逻辑错误点在于:grpcnt-grpcnt1是连续同值序列的分组标识,本身不代表序列的连续出现长度,直接在WHERE层判断该值>=3会把不满足长度要求的分组也筛选进来,所以出现了多余的C结果。
正确查询SQL
SELECT DISTINCT Name FROM ( SELECT Name, COUNT(*) AS continuous_cnt FROM ( SELECT Id, Name, -- 全局行号减去同Name内的行号,相同值代表属于同一个连续同Name序列 ROW_NUMBER() OVER(ORDER BY Id) - ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Id) AS group_id FROM test ) t GROUP BY Name, group_id -- 筛选连续出现次数不少于4次的分组 HAVING COUNT(*) >= 4 ) res;
逻辑说明
- 最内层子查询通过两个行号的差值生成
group_id,将连续出现的相同Name归为同一分组 - 中层按
Name和group_id分组统计每组行数,得到每个连续序列的出现次数 - 外层对符合次数要求的Name去重,得到最终结果
运行上述SQL输出结果仅为B,完全符合需求。
内容的提问来源于stack exchange,提问作者Mounika
相关产品推荐
相关产品推荐

