从重叠的时间间隔创建完整的历史时间线

时间:2018-06-19 19:36:22

标签: sql oracle

我在下表中包含代码,从,到和小时。问题是我在间隔中有重叠的日期。相反,我想创建一个完整的历史时间表。因此,代码是相同的,并且有重叠的地方,应该合计小时数,如期望的结果一样。

**表格**

+------+-------+--------------------------------------+
| code | from           | to             | hours      |
+------+-------+--------------------------------------+
| 1    | 2013-05-01     | 2013-09-30     | 37         |
| 1    | 2013-05-01     | 2014-02-28     | 10         |
| 1    | 2013-10-01     | 9999-12-31     | 5          |
+------+-------+--------------------------------------+

所需结果:

+------+-------+--------------------------------------+
| code | from           | to             | hours      |
+------+-------+--------------------------------------+
| 1    | 2013-05-01     | 2013-09-30     | 47         |
| 1    | 2013-10-01     | 2014-02-28     | 15         |
| 1    | 2014-02-29     | 9999-12-31     | 5          |
+------+-------+--------------------------------------+

1 个答案:

答案 0 :(得分:0)

Oracle设置

CREATE TABLE Table1 ( code, "FROM", "TO", hours ) AS
SELECT 1, DATE '2013-05-01', DATE '2013-09-30', 37 FROM DUAL UNION ALL
SELECT 1, DATE '2013-05-01', DATE '2014-02-28', 10 FROM DUAL UNION ALL
SELECT 1, DATE '2013-10-01', DATE '9999-12-31',  5 FROM DUAL;

查询

SELECT *
FROM   (
  SELECT code,
         dt AS "FROM",
         LEAD( dt ) OVER ( PARTITION BY code ORDER BY dt ASC, value DESC, ROWNUM ) AS "TO",
         hours
  FROM   (
    SELECT code,
           dt,
           SUM( hours * value ) OVER ( PARTITION BY code ORDER BY dt ASC, VALUE DESC ) AS hours,
           value
    FROM   table1
    UNPIVOT ( dt FOR value IN ( "FROM" AS 1, "TO" AS -1 ) )
  )
)
WHERE  "FROM" + 1 < "TO";

结果

CODE FROM       TO         HOURS
---- ---------- ---------- -----
   1 2013-05-01 2013-09-30    47
   1 2013-10-01 2014-02-28    15
   1 2014-02-28 9999-12-31     5