在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()
byDate-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
?ADATE
或DATETIME
或…?@JoachimIsaksson它是类型DATE