基於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 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畢竟只是數據庫語言,不能跟其他語言比功能性,所以有時需要用一些取巧的方式來達到結果
比如去固定取每周的周幾,可以用日期除以7再通過去mod的方式來實現;上面這題中,兩個關鍵點,
1、row_number()over(order by id)這句取順序序號;
2、row_number()over(partition by num order by id) 這句用來取同個num下的序號;
上面的1跟2相減,由於連續值在該相減過程中差值是一樣的,如下圖,故可以通過該方法取出連續值