SQL查找连续出现的数字

基于Oracle;

题:编写一个 SQL 查询,查找所有至少连续出现三次的数字。

+----+-----+| Id | Num |+----+-----+| 1 | 1 || 2 | 1 || 3 | 1 || 4 | 2 || 5 | 1 || 6 | 2 || 7 | 2 |+----+-----+

例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

+-----------------+| ConsecutiveNums |+-----------------+| 1 |+-----------------+

解决代码如下:
SELECT DISTINCT num ConsecutiveNumsFROM ( SELECT num ,count(1) rn2 FROM ( SELECT Id ,Num ,row_number() OVER ( ORDER BY ID ) - row_number() OVER ( PARTITION BY Num ORDER BY Id ) rn FROM Logs ) GROUP BY num ,rn )WHERE rn2 >= 3

题目不难也不复杂,思路比较有趣,故写文解释一下,写代码往往有一些取巧的方式,由于SQL毕竟只是数据库语言,不能跟其他语言比功能性,所以有时需要用一些取巧的方式来达到结果

比如去固定取每周的周几,可以用日期除以7再通过去mod的方式来实现;上面这题中,两个关键点,

1、row_number()over(order by id)这句取顺序序号;

2、row_number()over(partition by num order by id) 这句用来取同个num下的序号;

上面的1跟2相减,由于连续值在该相减过程中差值是一样的,如下图,故可以通过该方法取出连续值

 

相关文章