簡體   English   中英

SQL Server:基於X的日期范圍的天數對row_number進行分區

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM