基于Oracle;数据库
题:编写一个 SQL 查询,查找全部至少连续出现三次的数字。spa
+----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | +----+-----+
例如,给定上面的 Logs
表, 1
是惟一连续出现至少三次的数字。code
+-----------------+ | ConsecutiveNums | +-----------------+ | 1 | +-----------------+
解决代码以下:
SELECT DISTINCT num ConsecutiveNums FROM ( 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毕竟只是数据库语言,不能跟其余语言比功能性,因此有时须要用一些取巧的方式来达到结果blog
好比去固定取每周的周几,能够用日期除以7再经过去mod的方式来实现;上面这题中,两个关键点,it
一、row_number()over(order by id)这句取顺序序号;io
二、row_number()over(partition by num order by id) 这句用来取同个num下的序号;class
上面的1跟2相减,因为连续值在该相减过程当中差值是同样的,以下图,故能够经过该方法取出连续值方法