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



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


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


;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


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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值