【问题标题】:Query Oracle to join date interval in one row查询Oracle以一行加入日期间隔
【发布时间】:2012-09-16 01:59:39
【问题描述】:

如果第二行的开始是第一行结束后的第二天,我的问题是加入更多的日期间隔。在所有这些情况下,我应该只有一排。 例如:

id      start           end
10      20120101        20120125
10      20120201        20120225
10      20120226        20120302
10      20120303        20120304

   

必须

10      20120101        20120125
10      20120201        20120304

你有什么建议吗?

【问题讨论】:

    标签: sql oracle date join range


    【解决方案1】:

    这是我的建议:您是否将这些行放在一个表中,我们称之为“temp_table”,您可以创建一个仅保留相关日期的视图:

    CREATE VIEW temp_view AS
    SELECT id, dd, ROWNUM AS nr
      FROM (
        SELECT s.ID, s.start_date AS dd --for izolated intervals, keep the wtart date
          FROM temp_table s, temp_table prv, temp_table nxt
         WHERE prv.end_date(+) = s.start_date-1 AND prv.ID(+) = s.ID
           AND s.end_date+1 = nxt.start_date(+) AND nxt.ID(+) = s.ID
           AND prv.ID IS NULL AND nxt.ID IS NULL
        UNION
        SELECT s.ID, decode(nxt.id, 
                       NULL, s.end_date, --no next interval => keep the end date
                       decode(prv.id,
                          NULL, s.start_date)  --no previous interval => keep the start date
                      ) AS dd 
          FROM temp_table s, temp_table prv, temp_table nxt
         WHERE prv.end_date(+) = s.start_date-1 AND prv.ID(+) = s.ID
           AND s.end_date+1 = nxt.start_date(+) AND nxt.ID(+) = s.ID
           AND (prv.ID IS NULL OR nxt.ID IS NULL)
        ORDER BY dd   --order all the dates ascending  
      ); 
    

    此视图将返回如下内容:

    ID  DD          NR
    10  20120101    1
    10  20120125    2
    10  20120201    3
    10  20120304    4
    

    您可以查询如下内容:

    SELECT start_dates.ID, start_dates.dd AS start_date, end_dates.dd AS end_date
      FROM temp_view start_dates, temp_view end_dates 
     WHERE start_dates.ID = end_dates.ID
       AND start_dates.nr+1 = end_dates.nr 
       AND MOD(start_dates.nr,2) = 1 
    

    结果:

    ID  START_DATE  END_DATE
    10  20120101    20120125
    10  20120201    20120304
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2011-09-02
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多