巧妙利用PARTITION分組排名遞增特性解決合并連續(xù)相同數(shù)據(jù)行
問題提出
先造一些測試數(shù)據(jù)以說明題目:
DECLARE @TestData TABLE(ID INT,Col1 VARCHAR(20),Col2 VARCHAR(20)) INSERT INTO @TestData(ID,Col1,Col2) SELECT 1,'New','Approved' UNION ALL SELECT 2,'Approved','Commited' UNION ALL SELECT 3,'Commited','In Progress' UNION ALL SELECT 4,'New','Approved' UNION ALL SELECT 5,'New','Approved' UNION ALL SELECT 6,'New','Approved' UNION ALL SELECT 7,'Approved','Removed' SELECT * FROM @TestData
數(shù)據(jù)說明,ID列連續(xù)自增,列1和列2都是TFS中PBI的狀態(tài)記錄,就是從什么變更到什么,如新建到批準,批準到提交神馬的
現(xiàn)在要求連續(xù)且相同的狀態(tài)變更記錄合并,不連續(xù)或者不同的狀態(tài)變更保留,例如:
以上圖為例,ID為1,4,5,6的記錄都是從New到Approved狀態(tài),但是記錄1與記錄4、5、6不相鄰,或者說不連續(xù),那么就要分成兩組,
記錄1一組,記錄4、5、6一組,其它記錄因為狀態(tài)變更不相同所以全部保留,最后的查詢結(jié)果應(yīng)該長成下圖這個樣子:
繼續(xù)之前你可以先自己試下,這可能會帶來新的解題思路,
解題思路
該問題的關(guān)鍵在于GROUP BY會把記錄1、4、5、6合并在一起,而這不符合要求,僅需要合并4、5、6,源表里沒有這樣一個字段可以將記錄1與記錄4、5、6區(qū)分開來,這是解題的關(guān)鍵
這里可以利用RANK函數(shù)配合使用PARTITION關(guān)鍵字,首先把1456分到一組去,同時產(chǎn)生一個組內(nèi)排名的新字段R,這個排名R很關(guān)鍵,后邊會用到,見下圖:
RANK函數(shù)不了解的點這里
RANK函數(shù)以Col1 + Col2為分組條件,這樣分成了四組,分別是New-Approved、Approved-Commited、Commited-In Progress、Approved-Removed
在New-Approved組內(nèi),記錄1、4、5、6分別排名1、2、3、4;其它組內(nèi)僅一條記錄,在其組內(nèi)排名均為1
現(xiàn)在制造了一個R字段,R字段標識了每條記錄在其組內(nèi)的排名,排名自1開始遞增,
源表內(nèi)ID自增,組內(nèi)排名R遞增,這就是解題的關(guān)鍵,
當連續(xù)相同的記錄出現(xiàn)時,其ID與其排名R在同時遞增,則其差值是相同的,拿到這個差值就可以很容易解決題目了,看下圖:
記錄4、5、6相同且連續(xù)出現(xiàn),其ID與其排名在同時增長,其差值則保持不變,這里使用Col1 + Col2 + Gap作為分組條件即可將記錄4、5、6合并,再取個最小ID出來,問題解決,完整腳本如下:
可是如果ID不連續(xù)時怎么辦呢?這個不難,參考[MSSQL]ROW_NUMBER函數(shù)
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。