1. 程式人生 > >SQL查找連續出現的數字

SQL查找連續出現的數字

sql 查詢 com art 解決 log 兩個 通過 功能性 相減

基於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相減,由於連續值在該相減過程中差值是一樣的,如下圖,故可以通過該方法取出連續值

技術分享圖片

SQL查找連續出現的數字