1

我有下表,其中包含代码,从,到和小时。问题是我在间隔中有重叠的日期。而不是它,我想创建一个完整的历史时间表。因此,当代码相同并且存在重叠时,它应该将小时数相加,就像期望的结果一样。

** 桌子 **

+------+-------+--------------------------------------+
| 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          |
+------+-------+--------------------------------------+
4

1 回答 1

0

甲骨文设置

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
于 2018-06-19T20:26:41.047 回答