程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 奇妙應用PARTITION分組排名遞增特征處理歸並持續雷同數據行

奇妙應用PARTITION分組排名遞增特征處理歸並持續雷同數據行

編輯:MSSQL

奇妙應用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函數

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved