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

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_NUMBEROVER/PARTITION BY功能,甚至一个Recursive Table Variable Function.我可以粘贴一些代码,但说实话,我的代码到目前为止还没有.如果这是一个简单的查询,但我只是没有正确地考虑它,那将是很好的.

先感谢您.

Joa*_*son 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;
Run Code Online (Sandbox Code Playgroud)

一个要测试的SQLfiddle.