基於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相減,因爲連續值在該相減過程當中差值是同樣的,以下圖,故能夠經過該方法取出連續值方法