SQL Server:row_number分区基于日期范围的X天数

时间:2017-06-24 07:56:55

标签: sql sql-server

我有以下输入。

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中完成。

2 个答案:

答案 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)