SQL连续天数问题


CREATE TABLE #Test_Gap
(
id INT IDENTITY,
CreateDate DATETIME
)
go
INSERT INTO #Test_Gap VALUES (GETDATE()-20)
INSERT INTO #Test_Gap VALUES (GETDATE()-18)
INSERT INTO #Test_Gap VALUES (GETDATE()-17)
INSERT INTO #Test_Gap VALUES (GETDATE()-13)
INSERT INTO #Test_Gap VALUES (GETDATE()-11)
INSERT INTO #Test_Gap VALUES (GETDATE()-10)
INSERT INTO #Test_Gap VALUES (GETDATE()-9)
INSERT INTO #Test_Gap VALUES (GETDATE()-8)
INSERT INTO #Test_Gap VALUES (GETDATE()-5)
INSERT INTO #Test_Gap VALUES (GETDATE()-3)
INSERT INTO #Test_Gap VALUES (GETDATE()-1)
GO
SELECT * FROM #Test_Gap

SQL连续天数问题_第1张图片


1、求出日期与指定任意一个日期(这里用2013-01-01)的天数差

2、求出小于等于当前日期的数据量

3、用1的结果-2的结果,如果两天是连续的,得到的结果就会相同。


SELECT id,CreateDate,DATEDIFF(DAY,'2013-01-01',CreateDate)-b.cnt rn
FROM  #Test_Gap x
	 CROSS APPLY(SELECT COUNT(*) cnt FROM #Test_Gap WHERE CreateDate<=x.CreateDate) b
SQL连续天数问题_第2张图片

现在只需要按照结果列分组就能求出连续天数


;WITH a AS(
SELECT id,CreateDate,DATEDIFF(DAY,'2013-01-01',CreateDate)-b.cnt rn
FROM  #Test_Gap x
	 CROSS APPLY(SELECT COUNT(*) cnt FROM #Test_Gap WHERE CreateDate<=x.CreateDate) b
)
SELECT MAX(CreateDate),COUNT(*)
FROM a
GROUP BY rn
HAVING COUNT(*)>1
SQL连续天数问题_第3张图片

总结:连续问题最关键的是怎么把两行连续的数据分到同一个组里,通常用公式计算出一个衍生列,然后按照衍生列分组,计算衍生列还有很多方法

   如用DENSE_RANK()先求出排名rn,再用DATEADD(day,rn,logintime),112)也能把连续的天分到一组里面。

你可能感兴趣的:(Sql,Server)