TSQL高级排名,分组查找日期跨度

时间:2014-11-16 20:54:06

标签: tsql sql-server-2008-r2 range grouping ranking

我需要在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

然后,每次主键更改DATA时,请拉出所述项目的日期范围,使其看起来像这样:

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

我一直在玩排名功能,但没有取得多大成功。任何正确方向的指针都会非常棒,并且很受欢迎。

1 个答案:

答案 0 :(得分: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