星期五, 3月 01, 2013

[SQL] 判斷連續資料

此論壇問題是希望可以針對每筆資料和它之後的兩筆資料進行加總(每三筆連續資料進行加總),萬一該筆資料後面沒有辦法湊成三筆資料的話,加總值以 NULL 表示。
[SQL] 判斷連續資料-3

    T-SQL 解法
-- 解法 1
SELECT 
 T.ID ,
  T.Data ,
  IIF(Judge IS NULL , NULL , Cum3) AS Cum3
FROM
  (
    SELECT * ,
        LEAD(Data,2,NULL) OVER (ORDER BY ID) AS Judge , 
        SUM(Data) OVER (ORDER BY ID ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)  AS Cum3
    FROM @Temp
  ) AS T

-- 解法 2
SELECT 
  T.ID , 
  T.Data , 
  IIF(Judge = 3 , Cum3 , NULL) AS Cum3
FROM 
  (
    SELECT * ,
        SUM(1) OVER (ORDER BY ID ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS Judge ,
        SUM(Data) OVER (ORDER BY ID ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)  AS Cum3
    FROM @Temp
  ) AS T

  • 邏輯分析:利用產生的 Sample Data 來說明判斷連續資料
    連續三筆資料範例資料
DECLARE @Temp TABLE (id int)
INSERT INTO @Temp VALUES(1)
INSERT INTO @Temp VALUES(4)
INSERT INTO @Temp VALUES(13)
INSERT INTO @Temp VALUES(7)
INSERT INTO @Temp VALUES(9)
INSERT INTO @Temp VALUES(29)
INSERT INTO @Temp VALUES(20)
INSERT INTO @Temp VALUES(24)
INSERT INTO @Temp VALUES(32)
INSERT INTO @Temp VALUES(10)
INSERT INTO @Temp VALUES(22)
INSERT INTO @Temp VALUES(27)
    解法一:分析函數 LEAD()
抓取每筆資料之後的第二筆資料,假如回傳 NULL 值,表示抓不到該筆資料之後的第二筆資料,非 NULL 資料則為連續三筆資料。
SELECT 
  T.ID ,  
  T.Judge ,
  IIF(Judge IS NULL , '否' , '是') AS [是否連續三筆資料]
FROM
  (
      SELECT * ,
          LEAD
              (
                 ID     -- 針對 ID 欄位來進行判斷
                 , 2    -- 對每筆資料後的第二筆資料取值
                 , NULL -- 該筆資料之後沒有第二筆資料的預設值
              ) OVER (ORDER BY ID) AS Judge
      FROM @Temp
  ) AS T
[SQL] OVER() 應用-判斷連續資料


    解法二:彙總函數 SUM()
利用 SUM() 搭配 OVER 來判斷是否連續三筆資料,每一筆資料給定常數 1 ,每三筆資料進行累積,結果為 3 的話,表示為連續三筆資料。
SELECT 
  T.id , 
  T.Judge , 
  IIF(Judge = 3 , '是' , '否') AS [是否連續三筆資料]
FROM 
  (
    SELECT ID ,
        SUM
            (
              1 -- 每筆資料給定常數值 1
            ) 
        OVER 
            (
              ORDER BY ID -- 根據 ID 欄位進行排序
              -- 表示每筆資料和資料之後的兩筆資料,總共三筆資料
              ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
            ) AS Judge
    FROM @Temp
  ) AS T
[SQL] 分析函數應用-判斷連續資料2

沒有留言:

張貼留言