我正在尝试为具有连续天数的客户分配一个Trip #
,如果他们在连续几天中断,则会增加旅行ID,例如在月份晚些时候。数据结构如下所示:
CustomerID Date
1 2014-01-01
1 2014-01-02
1 2014-01-04
2 2014-01-01
2 2014-01-05
2 2014-01-06
2 2014-01-08
基于上述示例数据集的所需输出为:
CustomerID Date Trip
1 2014-01-01 1
1 2014-01-02 1
1 2014-01-04 2
2 2014-01-01 1
2 2014-01-05 2
2 2014-01-06 2
2 2014-01-08 3
因此,如果该客户的日期是背靠背,则它被认为是相同的旅行,并且具有相同的旅行#。有没有办法在SQL Server中执行此操作?我正在使用MSSQL 2012。
我最初的想法是使用LAG
,ROW_NUMBER
或OVER/PARTITION BY
函数,甚至是Recursive Table Variable Function
。我可以粘贴一些代码,但说实话,我的代码到目前为止还没有。如果这是一个简单的查询,但我只是没有正确地考虑它,那就太好了。
提前谢谢。
答案 0 :(得分:5)
由于Date
是DATE
(即没有小时数),您可以使用DENSE_RANK()
Date - ROW_NUMBER() days
来WITH cte AS (
SELECT CustomerID, Date,
DATEADD(DAY,
-ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY Date),
Date) dt
FROM trips
)
SELECT CustomerID, Date,
DENSE_RANK() OVER (PARTITION BY CustomerID ORDER BY dt)
FROM cte;
,这将为连续几天提供一个恒定值,等;
{{1}}