Oracle SQL中的连续和非连续日期范围:查找最早的日期

Sabyasachi Mitra

我需要您的帮助来解决此问题:

这是我的数据

id      start_date  end_date    
5567    2008-04-17  2008-04-30
5567    2008-05-02  2008-07-31
5567    2008-08-01  2008-08-31
5567    2008-09-01  2009-12-31

由于在2008-04-30和2008-05-02之间存在间隔,因此要求显示间隔之后的最早开始日期。

id      start_date  end_date
5567    2008-05-02  2008-08-31

这是另一组数据:

id      start_date  end_date
5567    2008-04-17  2008-04-30
5567    2008-05-01  2008-07-31
5567    2008-08-01  2008-08-31
5567    2008-09-01  2009-12-31

在这种情况下,所有跨度都是连续的,因此最早的开始日期应在输出上。输出应为:

id      start_date  end_date
5567    2008-04-17  2008-04-30

这是我使用的代码:

select 
id, min(start_date), contig
from (
  select 
   id, start_date, end_date,
   case 
     when lag(end_date) over (partition by id order by end_date) =       
     start_date-1 or row_number() over (partition by id order by    
     end_date)=1 
        then 'c' else 'l' end contig
    from t2 )
 group by id, contig;

当跨度之间没有间隔时,它会起作用,但是间隔出现时,它会给出两个记录。

例如,当跨度连续时,我的查询返回:

ID      MIN(START_DATE  CONTIG
5567    17-APR-08       c

但是,当数据不连续时,它将显示两个记录:

ID      MIN(START_DATE  CONTIG
5567    02-MAY-08       l
5567    17-APR-08       c

但是在这种情况下,我只想要第一个记录。

我知道有一个PL / SQL解决方案,但是我只能在SQL中实现吗?该数据库是Oracle 11gR2。

戈登·利诺夫(Gordon Linoff)

我认为这将满足您的要求:

select start_date
from (select t2.start_date
      from t2 left join
           t2 t2p
           on t2.start_date = t2p.end_date + 1
      where t2p.end_date is null
      order by t2.start_date nulls last
     ) t
where rownum = 1;

您还可以使用以下方法执行此操作lag()

select coalesce(min(case when prev_end_date is not null then start_date end),
                min(start_date))
from (select t2.*, lag(t2.end_date) over (order by t2.start_date) as prev_end_date
      from t2
     ) t
where prev_end_date is null or prev_end_date <> start_date - 1;

您的“其他”情况有些棘手。您必须注意不要始终获得最短的开始日期。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Oracle SQL - 来自多个日期列的最早日期

来自分类Dev

Oracle查询按连续值分组并获取开始日期和结束日期

来自分类Dev

SQL 连续天数 - Oracle

来自分类Dev

如何在Oracle SQL中查找日期范围内的丢失数据

来自分类Dev

Oracle SQL和JOINS的连续数字间隔

来自分类Dev

Oracle SQL 选择具有最早时间的日期时间

来自分类Dev

如何在连续的行中提取最小和最大日期-oracle

来自分类Dev

在 oracle SQL 中选择和分组多个日期范围

来自分类Dev

在SQL中查找所有连续日期

来自分类Dev

基于SQL(Oracle)中预定义的日期范围的组记录

来自分类Dev

Oracle:最早的入住日期(两列)

来自分类Dev

Oracle-仅返回最早或现在的日期

来自分类Dev

Oracle SQL-将连续数字设置为范围

来自分类Dev

SQL中的日期转换(Oracle)

来自分类Dev

Oracle SQL 中的日期差异

来自分类Dev

在 Oracle SQL 查询中创建日期并查找时差

来自分类Dev

Oracle SQL内部联接日期范围

来自分类Dev

Oracle SQL循环遍历日期范围

来自分类Dev

SQL Oracle:合并连续的行

来自分类Dev

在 Oracle 中循环查找日期失败

来自分类Dev

Oracle SQL日期格式

来自分类Dev

Oracle SQL比较日期

来自分类Dev

Oracle SQL遍历日期

来自分类Dev

Oracle SQL比较日期

来自分类Dev

Oracle SQL遍历日期

来自分类Dev

Oracle SQL查询中的开始/结束日期和时间

来自分类Dev

在oracle中的日期之间

来自分类Dev

Oracle中的日期操作

来自分类Dev

如何确定数字在Oracle SQL中是否是连续的