12
返回列表 发新帖
楼主: tti76543

大神进来,求精妙 SQL

[复制链接]
求职 : 技术/实施/服务顾问
论坛徽章:
8
八级虎吧徽章
日期:2009-02-08 21:58:53世界杯纪念徽章
日期:2014-07-14 11:31:46
11#
 楼主| 发表于 2017-4-3 22:50 | 只看该作者
newkid 发表于 2017-4-2 10:27
合并连续区间的帖子有不少了,比如这个:
http://www.itpub.net/thread-1223937-1-1.html

浏览了一下,还需要研究仔细才能明白。
很有参考价值,多谢了。

使用道具 举报

回复
论坛徽章:
4
目光如炬
日期:2015-11-01 22:00:00目光如炬
日期:2015-11-01 22:00:00秀才
日期:2017-05-17 11:34:12秀才
日期:2017-05-17 11:39:09
12#
发表于 2017-5-8 17:24 | 只看该作者
数据给的不用心啊
4                 D              2017/03/31   2017/04/31
5                 E              2017/03/01   2017/04/31
这哪里有4月31号

跟着newkid学了一下
with tmp as
(select 1 line_num,
         'A' item,
         to_date('2017/03/01', 'yyyy/mm/dd') date_from,
         to_date('2017/03/31', 'yyyy/mm/dd') date_to
    from dual
  union all
  select 2,
         'B',
         to_date('2017/03/01', 'yyyy/mm/dd'),
         to_date('2017/03/31', 'yyyy/mm/dd')
    from dual
  union all
  select 3,
         'C',
         to_date('2017/03/01', 'yyyy/mm/dd'),
         to_date('2017/03/31', 'yyyy/mm/dd')
    from dual
  union all
  select 4,
         'D',
         to_date('2017/03/31', 'yyyy/mm/dd'),
         to_date('2017/04/30', 'yyyy/mm/dd')
    from dual
  union all
  select 5,
         'E',
         to_date('2017/03/01', 'yyyy/mm/dd'),
         to_date('2017/04/30', 'yyyy/mm/dd')
    from dual
  union all
  select 6,
         'F',
         to_date('2017/01/01', 'yyyy/mm/dd'),
         to_date('2017/02/28', 'yyyy/mm/dd')
    from dual
  union all
  select 7,
         'G',
         to_date('2017/05/01', 'yyyy/mm/dd'),
         to_date('2017/05/31', 'yyyy/mm/dd')
    from dual
  union all
  select 8,
         'H',
         to_date('2017/05/01', 'yyyy/mm/dd'),
         to_date('2017/07/31', 'yyyy/mm/dd')
    from dual),
tmp2 as
(select t.*,
         (case
           when date_from <= max(date_to)
            over(order by date_from,
                     date_to rows between unbounded preceding and 1 preceding) then
            0
           else
            1
         end) broken
    from tmp t),
tmp3 as
(select line_num,
         item,
         date_from,
         date_to,
         sum(broken) over(order by date_from, date_to) flag
    from tmp2),
tmp4 as
(select min(date_from) start_date, max(date_to) end_Date
    from tmp3
   group by flag)
select count(1) cnt, start_Date, end_Date
  from tmp t
  left join tmp4
    on date_from >= start_date
   and date_to <= end_date
group by start_Date, end_Date
order by start_Date;

使用道具 举报

回复
论坛徽章:
0
13#
发表于 2017-5-8 22:19 | 只看该作者
哈哈,我来献丑。select count(1),to_char(date_from,'YYYYMMDD')||to_char(date_to,'YYYYMMDD') from xxx group by to_char(date_from,'YYYYMMDD')||to_char(date_to,'YYYYMMDD')

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
14#
发表于 2017-5-9 09:10 | 只看该作者
tti76543 发表于 2017-4-1 22:48
你把我问的问题想简单了。
如果不止 8条记录呢?如果日期不是我举例用的那几个日期呢?

自己没说清楚问题,应该先纠正自己

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表