SQL经典问题:找出连续日期及连续的天数
create table tmptable(rq datetime)
go
insert tmptable values('2010.1.1')
insert tmptable values('2010.1.2')
insert tmptable values('2010.1.3')
insert tmptable values('2010.1.6')
insert tmptable values('2010.1.7')
insert tmptable values('2010.1.10')
insert tmptable values('2010.1.11')
insert tmptable values('2010.1.12')
insert tmptable values('2010.1.19')
insert tmptable values('2010.1.20')
insert tmptable values('2010.1.22')
insert tmptable values('2010.1.23')
insert tmptable values('2010.1.28')
go
---希望得到的结果
--本期起始日期 本期终止日期 持续天数 距上一期天数
--2010.1.1 2010.1.3 3 0
--2010.1.6 2010.1.7 2 3
--2010.1.10 2010.1.12 3 3
--2010.1.19 2010.1.20 2 7
--2010.1.22 2010.1.23 2 2
--2010.1.28 2010.1.28 1 5
SELECT 本期起始日期 = MIN(rq)
, 本期终止日期 = MAX(rq)
, 持续天数 = MAX(id1) - MIN(id1) + 1
, 距上一期天数 = CASE a.id1 - a.id2
WHEN -1 THEN 0
ELSE MAX(datediff(d, rq2, rq))
END
FROM (
SELECT id1 = datediff(d, '2010-01-01', rq)
, id2 = (
SELECT COUNT(1)
FROM tmptable
WHERE rq <= a.rq
), rq2 = (
SELECT MAX(rq)
FROM tmptable
WHERE rq < a.rq
)
, *
FROM tmptable a
) a
GROUP BY a.id1 - a.id2 /*
本期起始日期 本期终止日期 持续天数 距上一期天数
----------------------- ----------------------- ----------- -----------
2010-01-01 00:00:00.000 2010-01-03 00:00:00.000 3 0
2010-01-06 00:00:00.000 2010-01-07 00:00:00.000 2 3
2010-01-10 00:00:00.000 2010-01-12 00:00:00.000 3 3
2010-01-19 00:00:00.000 2010-01-20 00:00:00.000 2 7
2010-01-22 00:00:00.000 2010-01-23 00:00:00.000 2 2
2010-01-28 00:00:00.000 2010-01-28 00:00:00.000 1 5
警告: 聚合或其他 SET 操作消除了空值。 (6 行受影响)
*/
例2:
create table t (qdate datetime,vcode varchar(50));
insert into t values('2013-06-01','A001');
insert into t values('2013-06-02','A001');
insert into t values('2013-06-02','B001');
insert into t values('2013-06-05','A001');
生成表如下:

按照vcode进行分组,按照qdate进行降序排列,记录行号rn
select *,ROW_NUMBER() over (partition by vcode order by qdate desc ) as rn from [my_exercise].[dbo].[t]
将日期减去行号,得到的结果rn连续相同时即为时间连续组
select *, (day(qdate) - row_number() over(partition by t.vcode order by t.qdate))rn from [my_exercise].[dbo].[t]
根据vcode和rn分组,得到的count即为连续的天数
select vcode,rn,count(*)as count
from (
select t.*,(day(t.qdate) - row_number()over(partition by t.vcode order by t.qdate)) rn
from [my_exercise].[dbo].[t]) a
group by vcode, rn
通过having即可筛选出连续天数>=3的vcode
select vcode,rn,count(*)as count
from (
select t.*,(day(t.qdate) - row_number()over(partition by t.vcode order by t.qdate)) rn
from [my_exercise].[dbo].[t]) a
group by vcode, rn
having count(1)>=3
SQL经典问题:找出连续日期及连续的天数的更多相关文章
- SQL经典问题 找出连续日期及连续的天数
		转自:http://bbs.csdn.net/topics/360019248 如何取到每段连续日期的起始终止日期以及持续天数及起始日期距上一期终止日期的天数,能否用一句sql实现?备注:数据库环境是 ... 
- [SQL]透過redgate SQL Monitor 來找出 ASYNC_NETWORK_IO 問題
		原文:[SQL]透過redgate SQL Monitor 來找出 ASYNC_NETWORK_IO 問題 最近因為在查一個SQL的效能問題,透過 sys.dm_os_wait_stats 來取得To ... 
- SQL Server如何找出一个表包含的页信息(Page)
		在SQL Server中,如何找到一张表或某个索引拥有那些页面(page)呢? 有时候,我们在分析和研究(例如,死锁分析)的时候还真有这样的需求,那么如何做呢? SQL Server 2012提供了一 ... 
- 485.  找出二进制串中连续的1的个数 Max Consecutive Ones
		Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ... 
- SQL顺序列找出断号
		select id from info id-----------123567810111215 (11 行受影响) 方法一: select (select max(id)+1 from Info w ... 
- sql 行数据找出最大的及所有数据最大的
		SELECT @charges=ISNULL(MAX(a.maxcharge), 0.00) FROM( SELECT (SELECT MAX(maxcharge) FROM(VALUES(ilong ... 
- SQL 经典语句大全
		原地址:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 一.基础 1.说明:创建数据库 CREATE DATABASE ... 
- 【Transact-SQL】找出不包含字母、不包含汉字的数据
		原文:[Transact-SQL]找出不包含字母.不包含汉字的数据 测试的同事,让我帮忙写个sql语句,找出表中xx列不包含汉字的行. 下面的代码就能实现. IF EXISTS(SELECT * FR ... 
- 在一个SQL Server表中的多个列找出最大值
		在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ... 
随机推荐
- CF367C. Hard problem
			链接[http://codeforces.com/group/1EzrFFyOc0/contest/706/problem/C] 题意: 他希望它们按词典顺序排序(就像字典中那样),但他不允许交换其中 ... 
- #个人博客作业week3——微软必应词典的使用
			产品的调研和评测 笔者使用的是win8的必应词典客户端. 首先打开客户端,用户界面的设计十分简洁,使用方便.但是词典主页与大多外语软件的设计相仿,例如有每日一句,每日阅读等模块,并没有令人感到新奇的地 ... 
- BugPhobia发布篇章:Beta版本学霸在线系统正式发布
			0x00:测试报告版本管理 版本号 具体细节 修订时间 V 1.0 整理第一轮迭代用户管理和登陆注册的功能性验证测试,预计将继续网页对浏览器版本的兼容性测试 2015/11/12 V1.0.1 整理第 ... 
- 在Eclipse中使用JUnit4进行单元测试(图文教程一)
			在Eclipse中使用JUnit4进行单元测试 单元测试,JUnit4. 这两个有什么关系呢?这就好比(草)单元测试和(割草机).用这个JUnit4工具去辅助我们进行测试.其实不理解这个也没关系,听多 ... 
- Minify or format javascript file by web or notepad++
			Notepad++ plugin manager install 'JSTOOL' http://tool.oschina.net/codeformat/js https://www.cnblogs. ... 
- Spring Framework: @RestController vs @Controller
			https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annota ... 
- Eclipse频繁崩溃问题待解决
			---------------------------Eclipse---------------------------Java was started but returned exit code ... 
- oracle mysql gbk varchar varchar2
			http://www.cnblogs.com/kxdblog/p/4042331.html https://wenku.baidu.com/view/97524e0f844769eae009ed80. ... 
- Win10 1803 升级之后无法使用 共享目录的解决方法
			1. 自己的虚拟机升级了win10 最新版本 1803 但是发现 使用共享文件夹时报错: 2, 百度发现解决方案还是非常简单的. 需要安装一个 功能 3.方法: 开始 运行 输入 control 打开 ... 
- Win10 1803 Spring Creators update  Consumer edition的版本记录
			安装时可选择的版本列表 安装完之后的版本: 3. 时间线更新 4. Focus assistant 
