[英]SQL Server : row_number partition based on the X number of days for the range of dates
我有以下輸入。
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 |
當上述輸入從“ STD_IDN”組的第一個日期開始划分X天(在本例中為10天)時,我想產生以下輸出。
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中完成。
讓我假設您希望有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;
這應該在您提供的數據上起作用。
遵循以下原則:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.