奇妙應用PARTITION分組排名遞增特征處理歸並持續雷同數據行。本站提示廣大學習愛好者:(奇妙應用PARTITION分組排名遞增特征處理歸並持續雷同數據行)文章只能為提供參考,不一定能成為您想要的結果。以下是奇妙應用PARTITION分組排名遞增特征處理歸並持續雷同數據行正文
成績提出
先造一些測試數據以解釋標題:
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
數聽說明,ID列持續自增,列1和列2都是TFS中PBI的狀況記載,就是從甚麼變革到甚麼,如新建到同意,同意到提交神馬的
如今請求持續且雷同的狀況變革記載歸並,不持續或許分歧的狀況變革保存,例如:
以上圖為例,ID為1,4,5,6的記載都是從New到Approved狀況,然則記載1與記載4、5、6不相鄰,或許說不持續,那末就要分紅兩組,
記載1一組,記載4、5、6一組,其它記載由於狀況變革不雷同所以全體保存,最初的查詢成果應當長成下圖這個模樣:
持續之前你可以先本身試下,這能夠會帶來新的解題思緒,
解題思緒
該成績的症結在於GROUP BY會把記載1、4、5、6歸並在一路,而這不相符請求,僅須要歸並4、5、6,源內外沒有如許一個字段可以將記載1與記載4、5、6辨別開來,這是解題的症結
這裡可以應用RANK函數合營應用PARTITION症結字,起首把1456分到一組去,同時發生一個組內排名的新字段R,這個排名R很症結,後邊會用到,見下圖:
RANK函數不懂得的點這裡
RANK函數以Col1 + Col2為分組前提,如許分紅了四組,分離是New-Approved、Approved-Commited、Commited-In Progress、Approved-Removed
在New-Approved組內,記載1、4、5、6分離排名1、2、3、4;其它組內僅一筆記錄,在其組內排名均為1
如今制作了一個R字段,R字段標識了每筆記錄在其組內的排名,排名自1開端遞增,
源表內ID自增,組內排名R遞增,這就是解題的症結,
當持續雷同的記載湧現時,其ID與其排名R在同時遞增,則其差值是雷同的,拿到這個差值便可以很輕易處理標題了,看下圖:
記載4、5、6雷同且持續湧現,其ID與其排名在同時增加,其差值則堅持不變,這裡應用Col1 + Col2 + Gap作為分組前提便可將記載4、5、6歸並,再取個最小ID出來,成績處理,完全劇本以下:
可是假如ID不持續時怎樣辦呢?這個不難,參考[MSSQL]ROW_NUMBER函數