Row_num 和按日期分区?

Row_num and Partition by DATE?

我正在努力寻找用 partition by 执行 row_number 的解决方案。

我的 table 看起来像这样(* 这是我唯一的专栏 *)

我的脚本是这样的:

SELECT 
    [P_ID],
    [DATE],
    ROW_NUMBER() OVER (PARTITION BY P_ID,[DATE] ORDER BY P_ID,[DATE] ) AS ROW
FROM #TEMP

我想按日期分组,第一行应该说 1,第二行也应该说 1,但第三行应该说 2,因为日期(依次)是 15 然后是 16,如果有 17 行会说 3 但如果有一个新行说 2015-09-21 那么它会回到第 1 行等等....

分区方式是否可行?

这是一个使用孤岛和间隙解决方案的解决方案:

DECLARE @t TABLE ( id INT, date DATE )
INSERT  INTO @t
VALUES  ( 2143, '20150902' ),
        ( 2143, '20150915' ),
        ( 2143, '20150916' ),
        ( 2143, '20150917' ),
        ( 2144, '20150902' ),
        ( 2144, '20150903' ),
        ( 2144, '20150916' ),
        ( 2144, '20150917' );

WITH    cte1
          AS ( SELECT   id ,
                        date ,
                        ROW_NUMBER() OVER ( PARTITION BY id ORDER BY date ) i
               FROM     @t
               GROUP BY id ,
                        date
             ),
        cte2
          AS ( SELECT   id ,
                        MIN(date) mi ,
                        MAX(date) ma ,
                        ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL
                                                     ) ) rn
               FROM     cte1
               GROUP BY id ,
                        DATEDIFF(DAY, i, date)
             )
    SELECT  t.* ,
            ROW_NUMBER() OVER ( PARTITION BY t.id, c.rn ORDER BY date )
    FROM    @t t
            JOIN cte2 c ON t.id = c.id
                           AND t.date BETWEEN c.mi AND c.ma

输出:

2143    2015-09-02  1
2143    2015-09-15  1
2143    2015-09-16  2
2143    2015-09-17  3
2144    2015-09-02  1
2144    2015-09-03  2
2144    2015-09-16  1
2144    2015-09-17  2