2017-06-24 55 views
0

我有以下輸入。SQL Server:row_number分區基於日期範圍內的X天數

STD_IDN | DATE_OF_JOINING | 
------- |----------------------| 
158440 |2013-01-27 00:00:00 | 
158442 |2013-01-01 00:00:00 | 
158442 |2013-01-02 00:00:00 | 
158442 |2013-01-03 00:00:00 | 
158442 |2013-02-05 00:00:00 | 
158442 |2013-02-09 00:00:00 | 
158442 |2013-02-19 00:00:00 | 
158442 |2013-03-02 10:21:30 | 
158442 |2013-03-16 16:15:58 | 
158442 |2013-03-29 00:00:00 | 
158442 |2013-04-12 18:15:36 | 
158442 |2013-04-28 08:46:59 | 
158442 |2013-04-28 09:17:48 | 
158442 |2013-05-16 16:15:58 | 
170098 |2013-01-13 00:00:00 | 
170098 |2013-01-14 00:00:00 | 
170098 |2013-02-21 00:00:00 | 
170098 |2013-02-26 00:00:00 | 
170098 |2013-02-28 00:00:00 | 
170098 |2013-06-16 00:00:00 | 
170098 |2013-06-22 00:00:00 | 
170098 |2013-07-26 00:00:00 | 
170098 |2013-07-27 00:00:00 | 

我想產生以下輸出當上述輸入X天分區(在這種情況下說10天)從該組「STD_IDN」的第一日起。

ROW_NUM| STD_IDN | DATE_OF_JOINING | 
-------|---------|----------------------| 
    1 | 158440 |2013-01-27 00:00:00 | 
    1 | 158442 |2013-01-01 00:00:00 | 
    2 | 158442 |2013-01-02 00:00:00 | 
    3 | 158442 |2013-01-03 00:00:00 | 
    1 | 158442 |2013-02-05 00:00:00 | 
    2 | 158442 |2013-02-09 00:00:00 | 
    1 | 158442 |2013-02-19 00:00:00 | 
    1 | 158442 |2013-03-02 10:21:30 | 
    1 | 158442 |2013-03-16 16:15:58 | 
    1 | 158442 |2013-03-29 00:00:00 | 
    1 | 158442 |2013-04-12 18:15:36 | 
    1 | 158442 |2013-04-28 08:46:59 | 
    2 | 158442 |2013-04-28 09:17:48 | 
    1 | 158442 |2013-05-16 16:15:58 | 
    1 | 170098 |2013-01-13 00:00:00 | 
    2 | 170098 |2013-01-14 00:00:00 | 
    1 | 170098 |2013-02-21 00:00:00 | 
    2 | 170098 |2013-02-26 00:00:00 | 
    3 | 170098 |2013-02-28 00:00:00 | 
    1 | 170098 |2013-06-16 00:00:00 | 
    1 | 170098 |2013-06-22 00:00:00 | 
    1 | 170098 |2013-07-26 00:00:00 | 
    2 | 170098 |2013-07-27 00:00:00 | 

我寧願這在普通的SQL中完成。

+0

如果你連續11天,這些會在一個或兩個組? –

回答

0

這些方針的東西:

SELECT stdin 
    ,convert(VARCHAR(12), Date_of_Joining) 
    ,count(*) 
FROM Yourtable 
WHERE Date_of_joining BETWEEN @start 
     AND @end 
GROUP BY stdin 
    ,convert(VARCHAR(12), Date_of_Joining) 
ORDER BY stdin 
    ,convert(VARCHAR(12), Date_of_Joining) 
1

讓我認爲你要10天的差距來定義一個組。如果是這樣,你可以使用lag(),累計總和,而一些邏輯:

select t.*, 
     row_number() over (partition by std_idn, grp order by date_of_joining) as row_num 
from (select t.*, 
      sum(case when date_of_joining > dateadd(day, 10, prev_doj) 
         then 1 else 0 
       end) as grp 
     from (select t.*, 
        lag(date_of_joining) over (partition by std_idn order by date_of_joining) as prev_doj 
      from t 
      ) t 
    ) t; 

這應該對你所提供的數據進行工作。