Aar*_*ier 4 sql sql-server sql-server-2012
我正在尝试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
Run Code Online (Sandbox Code Playgroud)
基于上述示例数据集的所需输出将是:
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
Run Code Online (Sandbox Code Playgroud)
因此,如果该客户的日期是背靠背,则它被认为是相同的旅行,并且具有相同的旅行#.有没有办法在SQL Server中执行此操作?我正在使用MSSQL 2012.
我最初的想法是使用LAG,ROW_NUMBER或OVER/PARTITION BY功能,甚至一个Recursive Table Variable Function.我可以粘贴一些代码,但说实话,我的代码到目前为止还没有.如果这是一个简单的查询,但我只是没有正确地考虑它,那将是很好的.
先感谢您.
既然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;
Run Code Online (Sandbox Code Playgroud)