如何添加列以标识日期序列

时间:2015-10-27 00:43:52

标签: sql sql-server database tsql date

我有很多预约会员ID和约会日期。我试图找到一种粗略识别约会顺序的方法。例如,下面我有用户" A"有五个约会记录在案。这些似乎是两个约会序列,一个在二月,另一个在五月。

| user | date | | A | 02-01-2014| | A | 02-09-2014| | A | 02-20-2014| | A | 05-10-2014| | A | 05-15-2014| | B | 01-05-2015| | B | 01-20-2015|

我想要提出的输出如下。我希望能够选择一些阈值,比如45天,此时将开始新的序列。例如,用户" A"在2014年5月5日预约,这是几个月内该用户的首次预约。因此,该约会在附加列中开始新序列。最终结果是每个用户都有一组约会,并附加一列来确定每行所属的序列。

| user | date | Sequence | | A | 02-01-2014| 1 | | A | 02-09-2014| 1 | | A | 02-20-2014| 1 | | A | 05-10-2014| 2 | | A | 05-15-2014| 2 | | B | 01-05-2015| 1 | | B | 01-20-2015| 1 |

我似乎找不到将这种逻辑纳入CASE声明的方法。如果它存在,我猜想丢失的部分能够引用先前的约会。有什么建议?谢谢!

2 个答案:

答案 0 :(得分:0)

如果您将序列定义为以至少45天的间隔开始,则可以使用窗口函数执行此操作:

select a.*, sum(SequenceStart) over (partition by user order by date) as seq
from (select a.*,
             (case when date > dateadd(day, 45, lag(date) over (partition by user order by date)) 
                   then 1 else 0 end
              end) as SequenceStart
      from appointment a
     ) a;

这使用了SQL Server 2012+的功能。在早期版本中也是如此。

答案 1 :(得分:0)

在MSSQL 2005+中,您可以使用DENSE_RANK,如下所示:

SELECT *,
       DENSE_RANK() OVER(PARTITION BY [user] ORDER BY DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)) AS [Sequence]
FROM Your_Table

希望这有帮助。