数字"/>
mysql:查询N个连续出现的数字
前言:
前面刚做的180.连续出现的数字是查询3个连续出现的数字,倘若要查询连续出现4,5…N个数字呢?当然这个问题肯定使用解决方法的,也可以说是模板。
解决方法:
-
1)找规律:我们发现连续的数字是相同的数字,但是id有可能不是连续的,我们就需要通过对结果集进行再次编号,让其变成连续的。原始数据表如下:
-
2)我们需要使用
row_number()
来对id进行升序排序,sql语句如下:
SELECT id,num,row_number() over (ORDER BY id) AS ordeFROM logs
查询结果如下:
- 3)我们使用partition by num对num分组(也就是num相同的作为一组),然后再用order by对相同的num组里面的id进行排序,sql语句如下:
SELECTid,num,row_number() over (PARTITION BY num ORDER BY id) AS ordeFROM logs
查询结果如下:
- 4)观察规律,我们可以发现将步骤2与步骤3的查询结果相减,只要num值相同的相减的值都是一样的,sql语句如下:
SELECTid,num,row_number() over (ORDER BY id) -row_number() over (PARTITION BY num ORDER BY id) as ordefrom logs
查询结果如下:
- 5)得出结果,分为两步。第一步对num与orde的组合进行分组检索;第二步检索num_count>=3的数字。
-- 第一步:检索num与orde分组的结果,即num与orde组合在一起相同的分为一组
SELECT num,count(*) num_count FROM(SELECT id,num,row_number() over (ORDER BY id)-row_number() over (PARTITION by num order by id) as ordefrom logs)as w GROUP BY num,orde
结果图如下:
-- 第二步:检索出连续出现3个数字
SELECT DISTINCT num as ConsecutiveNums from(SELECT num,count(*) num_count FROM(SELECT id,num,row_number() over (ORDER BY id)-row_number() over (PARTITION by num order by id) as ordefrom logs)as w GROUP BY num,orde)as s where num_count >=3
结果图如下:
更多推荐
mysql:查询N个连续出现的数字
发布评论