国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

巧妙利用PARTITION分組排名遞增特性解決合并連續相同數據行

2024-08-31 01:02:18
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了巧妙利用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

巧妙利用PARTITION分組排名遞增特性解決合并連續相同數據行

巧妙利用PARTITION分組排名遞增特性解決合并連續相同數據行

數據說明,ID列連續自增,列1和列2都是TFS中PBI的狀態記錄,就是從什么變更到什么,如新建到批準,批準到提交神馬的

現在要求連續且相同的狀態變更記錄合并,不連續或者不同的狀態變更保留,例如:

以上圖為例,ID為1,4,5,6的記錄都是從New到Approved狀態,但是記錄1與記錄4、5、6不相鄰,或者說不連續,那么就要分成兩組,

記錄1一組,記錄4、5、6一組,其它記錄因為狀態變更不相同所以全部保留,最后的查詢結果應該長成下圖這個樣子:

巧妙利用PARTITION分組排名遞增特性解決合并連續相同數據行

繼續之前你可以先自己試下,這可能會帶來新的解題思路,

解題思路

該問題的關鍵在于GROUP BY會把記錄1、4、5、6合并在一起,而這不符合要求,僅需要合并4、5、6,源表里沒有這樣一個字段可以將記錄1與記錄4、5、6區分開來,這是解題的關鍵

這里可以利用RANK函數配合使用PARTITION關鍵字,首先把1456分到一組去,同時產生一個組內排名的新字段R,這個排名R很關鍵,后邊會用到,見下圖:

巧妙利用PARTITION分組排名遞增特性解決合并連續相同數據行

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在同時遞增,則其差值是相同的,拿到這個差值就可以很容易解決題目了,看下圖:

巧妙利用PARTITION分組排名遞增特性解決合并連續相同數據行

記錄4、5、6相同且連續出現,其ID與其排名在同時增長,其差值則保持不變,這里使用Col1 + Col2 + Gap作為分組條件即可將記錄4、5、6合并,再取個最小ID出來,問題解決,完整腳本如下:

巧妙利用PARTITION分組排名遞增特性解決合并連續相同數據行

可是如果ID不連續時怎么辦呢?這個不難,參考[MSSQL]ROW_NUMBER函數


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 涞源县| 桐城市| 黎川县| 浠水县| 南阳市| 城口县| 河东区| 延长县| 尤溪县| 象州县| 忻城县| 永兴县| 兰州市| 灵武市| 疏附县| 察雅县| 灵宝市| 如东县| 独山县| 玉环县| 鹤峰县| 沈阳市| 修文县| 隆化县| 庐江县| 双柏县| 文化| 嘉义市| 惠安县| 宁化县| 孝义市| 南宫市| 潼南县| 全椒县| 高尔夫| 西峡县| 贺兰县| 静宁县| 突泉县| 林州市| 南安市|