使用date和Row_Num(Rank_Num)进行分区

时间:2016-02-25 13:38:25

标签: sql-server

我想帮助解决这个问题。

OUTPUT 字段是我想要的" ROW_NUM "字段看起来像。

我想尽可能使用 row_num rank_num over partition

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

enter image description here

P_ID    DATE    ROW_NUM     OUTPUT
3385    2012-02-02  1       1
3385    2012-02-03  2       2
3385    2012-09-24  3       1
3385    2012-09-25  4       2
3385    2013-11-12  5       1
3385    2013-11-13  6       2
3385    2013-11-14  7       3
3385    2013-11-15  8       4
3385    2014-09-09  9       1
3385    2014-09-10  10      2
3385    2014-09-11  11      3
3385    2015-11-11  12      1
3385    2015-11-12  13      2
3385    2015-11-13  14      3
5538    2012-02-02  15      1
5538    2013-11-12  16      1
5538    2013-11-13  17      2

1 个答案:

答案 0 :(得分:0)

看起来您想要枚举每个pid的连续日期。您可以通过从日期中减去行号来实现此目的 - 差异对于连续日期是不变的。剩下的就是row_number()

select t.*,
       row_number() over (partition by pid, grp order by date)
from (select t.*,
             dateadd(day,
                     - row_number() over (partition by pid order by date)
                     date) as grp
      from #temp t
     ) t;

注意:这是SQL Server语法(看起来像您正在使用的数据库。日期函数因数据库而异。