2014-11-16 46 views
0

我需要做一些先進的分組中TSQL,看起來像這樣的數據:TSQL先進的排名,分組找到日期跨越

PK YEARMO DATA 
1 201201 AAA 
1 201202 AAA 
1 201203 AAA 
1 201204 AAA 
1 201205 (null) 
1 201206 BBB 
1 201207 AAA 
2 201301 CCC 
2 201302 CCC 
2 201303 CCC 
2 201304 DDD 
2 201305 DDD 

然後,每個主鍵每次數據的變化,拉起日期以便它看起來像這樣:

PK START_DT STOP_DT DATA 
1 201201 201204 AAA 
1 201205 201205 (null) 
1 201206 201206 BBB 
1 201207 201207 AAA 
2 201301 201303 CCC 
2 201304 201305 DDD 

我一直在玩排名的功能,但沒有太大的成功。任何指向正確方向的指針都將非常棒,並且令人讚賞。

+0

請告訴我您的SQL Server版本? – Mihai

+0

我們正在運行MS SQL 2008 R2。 – mooselover

回答

2

可以使用row_number()功能將數據分成範圍:

SELECT 
    PK, 
    START_DT = MIN(YEARMO), 
    STOP_DT = MAX(YEARMO), 
    DATA 
FROM (
    SELECT 
     PK, DATA, YEARMO, 
     ROW_NUMBER() OVER (ORDER BY YEARMO) - 
     ROW_NUMBER() OVER (PARTITION BY PK, DATA ORDER BY YEARMO) grp 
    FROM your_table 
    ) A 
GROUP BY PK, DATA, grp 
ORDER BY MIN(YEARMO) 

Sample SQL Fiddle

+1

你的'grp'是天才,正是我一直在努力寫作。我必須做的唯一編輯是第一個ROW_NUMBER(),通過將PK添加到排序中,然後它完全按照描述提供輸出。非常感謝! – mooselover