我有以下输入。
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中完成。
答案 0 :(得分: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;
这应该适用于您提供的数据。
答案 1 :(得分: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)