2015-11-30 32 views
2

我在努力寻找row_numberpartition by的解决方案。Row_num和DATE分区?

我的表看起来像这样(*这是我唯一的列*)

enter image description here

我的剧本是这样的:

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行,依此类推......

这是可能的分区?

+3

*一般来说*,如果你在'PARTITION BY'和'都在同一列ORDER BY',你做错了什么。 –

+0

我会讽刺的,但后来我意识到所有的答案都是很好的答案,所以谢谢:) – Nils

+0

忽略请,错误,对不起 –

回答

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 
+0

这工作谢谢:) – Nils