我有很多预约会员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声明的方法。如果它存在,我猜想丢失的部分能够引用先前的约会。有什么建议?谢谢!
答案 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
希望这有帮助。