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经典问题:找出连续日期及连续的天数的更多相关文章

  1. SQL经典问题 找出连续日期及连续的天数

    转自:http://bbs.csdn.net/topics/360019248 如何取到每段连续日期的起始终止日期以及持续天数及起始日期距上一期终止日期的天数,能否用一句sql实现?备注:数据库环境是 ...

  2. [SQL]透過redgate SQL Monitor 來找出 ASYNC_NETWORK_IO 問題

    原文:[SQL]透過redgate SQL Monitor 來找出 ASYNC_NETWORK_IO 問題 最近因為在查一個SQL的效能問題,透過 sys.dm_os_wait_stats 來取得To ...

  3. SQL Server如何找出一个表包含的页信息(Page)

    在SQL Server中,如何找到一张表或某个索引拥有那些页面(page)呢? 有时候,我们在分析和研究(例如,死锁分析)的时候还真有这样的需求,那么如何做呢? SQL Server 2012提供了一 ...

  4. 485. 找出二进制串中连续的1的个数 Max Consecutive Ones

    Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...

  5. SQL顺序列找出断号

    select id from info id-----------123567810111215 (11 行受影响) 方法一: select (select max(id)+1 from Info w ...

  6. sql 行数据找出最大的及所有数据最大的

    SELECT @charges=ISNULL(MAX(a.maxcharge), 0.00) FROM( SELECT (SELECT MAX(maxcharge) FROM(VALUES(ilong ...

  7. SQL 经典语句大全

    原地址:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 一.基础 1.说明:创建数据库 CREATE DATABASE ...

  8. 【Transact-SQL】找出不包含字母、不包含汉字的数据

    原文:[Transact-SQL]找出不包含字母.不包含汉字的数据 测试的同事,让我帮忙写个sql语句,找出表中xx列不包含汉字的行. 下面的代码就能实现. IF EXISTS(SELECT * FR ...

  9. 在一个SQL Server表中的多个列找出最大值

    在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ...

随机推荐

  1. Visual Studio 2013版本安装

    这周老师布置了关于Visual Studio 2013版本安装过程的概述,下面我就分享给大家看吧! 首先要下载安装文件,等待下载完成之后,虽然下载文件是ios格式,但我们可以用解压缩工具解压打开.解压 ...

  2. Scrum Meeting 5

                第五次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...

  3. Linux实践三:程序破解

    一.汇编指令机器码 二.反汇编与十六进制编程器 三.可执行文件的基本格式 hexdump -x login 用16进制数字显示login内容 objdump -x login 显示login中各个段以 ...

  4. HTML编码规则

    <!DOCTYPE html><!-- 为每一个HTML页面的第一行添加标准模式 --> <html lang="en-us"> <!-- ...

  5. 面向对象课程 - T-shirt

    拿到了一件谜一样的T-shirt 吓得我赶紧捏了下hbb

  6. [工作相关] 一个虚拟机上面的SAP4HANA的简单使用维护

    1.公司组织竞品分析, 选择了SAP的 SAP4HANA作为竞品 这边协助同事搭建了SAP4HANA的测试环境: 备注 这个环境 应该是同事通过一些渠道获取到的. 里面是基于这个虚拟机进行的说明:: ...

  7. MongoDb在windows10下的安装、创建用户和数据库

    1.mongodb下载地址https://www.mongodb.com/download-center#community 2.安装    3.在D:\MongoDB目录下创建db和log两个文件夹 ...

  8. .NET中的许可证机制--License

    .NET中的许可证机制主要类:System.ComponentModel.License(为所有许可证提供 abstract 基类.向组件的特定实例授予许可证)     System.Componen ...

  9. rsync实现数据同步

    希望两台机器指定目录的数据保持一致 192.168.19.252(master)                 192.168.19.251(slave) /cache 拉复制            ...

  10. Lodop打印设计界面生成代码带”...(省略)”

    Lodop的设计界面中,菜单里的生成代码,如果打印项内容过多,后面会显示”...(省略)”,省略的是打印项的内容值,无论是纯文本还是超文本,都可以用选中打印项-右键-设置属性里找到该打印项的全部值,可 ...