将SQL Server中的计数器分配给具有连续日期的记录,并仅在日期不连续时递增

时间:2014-09-11 20:57:40

标签: 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

基于上述示例数据集的所需输出为:

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。

我最初的想法是使用LAGROW_NUMBEROVER/PARTITION BY函数,甚至是Recursive Table Variable Function。我可以粘贴一些代码,但说实话,我的代码到目前为止还没有。如果这是一个简单的查询,但我只是没有正确地考虑它,那就太好了。

提前谢谢。

1 个答案:

答案 0 :(得分:5)

由于DateDATE(即没有小时数),您可以使用DENSE_RANK() Date - ROW_NUMBER() daysWITH 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}}

An SQLfiddle to test with