如何总结时间,不包括与 Oracle 中给定的开始日期时间和结束日期时间重叠的时间
How to sum up the time excluding the overlapping time with given start datetime and end datetime in Oracle
数据如下
+----+-------------------+-------------------+
|KEY |START_DTT |END_DTT |
+----+-------------------+-------------------+
|KEY1|2020-11-24 00:00:00|2020-11-24 00:10:00|
|KEY1|2020-11-24 00:00:00|2020-11-24 00:20:00|
|KEY1|2020-11-24 00:10:00|2020-11-24 00:30:00|
|KEY1|2020-11-24 00:20:00|2020-11-24 00:50:00|
|KEY1|2020-11-24 00:55:00|2020-11-24 01:00:00|
+----+-------------------+-------------------+
我想要得到的是在 Oracle 中不包括重叠时间的总和(以分钟为单位)。
有什么功能或方法可以做到这一点吗?
您可以使用解析函数和GROUP BY
如下:
SELECT KEY, SUM(DIFF) AS DIFF FROM
(SELECT KEY,
MIN(START_DTT) AS START_DTT,
MAX(END_DTT) AS END_DTT,
ROUND(24*60*(MAX(END_DTT) - MIN(START_DTT)),2) AS DIFF
FROM
(SELECT T.*,
SUM(CASE WHEN LAG_END_DTT BETWEEN START_DTT AND END_DTT THEN 0 ELSE 1 END)
OVER (PARTITION BY KEY ORDER BY START_DTT) AS SM
FROM (SELECT T.*,
LAG(END_DTT) OVER (PARTITION BY KEY ORDER BY START_DTT) LAG_END_DTT
FROM T) T)
GROUP BY KEY, SM)
GROUP BY KEY;
感谢 VBoka,db<>fiddle
数据如下
+----+-------------------+-------------------+
|KEY |START_DTT |END_DTT |
+----+-------------------+-------------------+
|KEY1|2020-11-24 00:00:00|2020-11-24 00:10:00|
|KEY1|2020-11-24 00:00:00|2020-11-24 00:20:00|
|KEY1|2020-11-24 00:10:00|2020-11-24 00:30:00|
|KEY1|2020-11-24 00:20:00|2020-11-24 00:50:00|
|KEY1|2020-11-24 00:55:00|2020-11-24 01:00:00|
+----+-------------------+-------------------+
我想要得到的是在 Oracle 中不包括重叠时间的总和(以分钟为单位)。 有什么功能或方法可以做到这一点吗?
您可以使用解析函数和GROUP BY
如下:
SELECT KEY, SUM(DIFF) AS DIFF FROM
(SELECT KEY,
MIN(START_DTT) AS START_DTT,
MAX(END_DTT) AS END_DTT,
ROUND(24*60*(MAX(END_DTT) - MIN(START_DTT)),2) AS DIFF
FROM
(SELECT T.*,
SUM(CASE WHEN LAG_END_DTT BETWEEN START_DTT AND END_DTT THEN 0 ELSE 1 END)
OVER (PARTITION BY KEY ORDER BY START_DTT) AS SM
FROM (SELECT T.*,
LAG(END_DTT) OVER (PARTITION BY KEY ORDER BY START_DTT) LAG_END_DTT
FROM T) T)
GROUP BY KEY, SM)
GROUP BY KEY;
感谢 VBoka,db<>fiddle