oracle sql 累计连续范围的天数

oracle sql totalize days for contiguos ranges

我有一个带日期范围的 table,我只需要计算连续日期范围的天数...

-----------------------------------
| table RANGES                    |
----------------------------------
| d_start    | d_end       | days |
| (date)     | (date)      | (num)|
-----------------------------------
| 2014-02-01 | 2014-02-05  |   4  |
| 2014-02-06 | 2014-02-11  |   5  |
| 2014-03-22 | 2014-03-25  |   3  |
| 2014-04-02 | 2014-04-10  |   8  |
| 2014-04-11 | 2014-04-20  |   9  |
-----------------------------------

当日期范围不连续时,我需要计算带中断的天数,结果如下:

| 2014-02-01 | 2014-02-11  |   9  |
| 2014-03-22 | 2014-03-25  |   3  |
| 2014-04-02 | 2014-04-20  |  17  |

我尝试使用 LEAD 检查下一条记录的 d_start 是否相等 d_end 但我无法实现目标。

非常感谢任何想法! 马可

答案很棘手:

SQL> create table tmp$dates (d_start date, d_end date);

Table created

SQL> insert into tmp$dates values (DATE '2014-02-01', DATE '2014-02-05');

1 row inserted

SQL> insert into tmp$dates values (DATE '2014-02-06', DATE '2014-02-11');

1 row inserted

SQL> insert into tmp$dates values (DATE '2014-03-22', DATE '2014-03-25');

1 row inserted

SQL> insert into tmp$dates values (DATE '2014-04-02', DATE '2014-04-10');

1 row inserted

SQL> insert into tmp$dates values (DATE '2014-04-11', DATE '2014-04-20');

1 row inserted

SQL> select min(d_start), max(d_end), max(d_end) - min(d_start) + 1 n#
  2  from tmp$dates d
  3  start with d_start not in (select d_end + 1 from tmp$dates)
  4  connect by prior d_end = d_start - 1
  5  group by level - rownum
  6  order by 1;

MIN(D_START) MAX(D_END)          N#
------------ ----------- ----------
01.02.2014   11.02.2014          11
22.03.2014   25.03.2014           4
02.04.2014   20.04.2014          19