此論壇問題是希望可以針對每筆資料和它之後的兩筆資料進行加總(每三筆連續資料進行加總),萬一該筆資料後面沒有辦法湊成三筆資料的話,加總值以 NULL 表示。
-- 解法 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)
抓取每筆資料之後的第二筆資料,假如回傳 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
利用 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
沒有留言:
張貼留言