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

在SQL Server中为具有连续日期的记录分配计数器,并且仅在日期不连续时递增,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我试图为连续天数的客户的记录分配一个行程35;,如果他们在连续天数内有休息,则增加行程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

我试图为连续天数的客户的记录分配一个
行程35;
,如果他们在连续天数内有休息,则增加行程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
行数
,或
OVER/partitionby
函数,甚至是
递归表变量函数
。我可以粘贴一些代码,但老实说,我的代码目前还不起作用。如果这是一个简单的查询,但我没有正确地思考它,那就太好了


提前谢谢。

由于
日期
日期(即没有小时),您可以使用
densite\u RANK()
by
Date-ROW\u 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;

.

既然您提到了LAG()函数,它是SQL Server 2012吗?@M.Ali,是的,我使用的是SQL Server 2012,它的数据类型是
Date
?A
DATE
DATETIME
或…?@JoachimIsaksson它是类型
DATE