我想将计算从Excel电子表格传输到Oracle SQL查询。
有三个预定义的列ID
,IncommingDate
和ProcessingTime
。
现在我要计算另外两个列,即Processing Start
和Processing End
。
结果应如下所示:
使用公式:
可以看到一个条目的ProcessingStart
应该是其IncommingDate
和上一个条目的ProcessingEnd
的最大值。
如何使用SQL实现此目的?
我在这里准备了一个示例查询:
WITH example AS
(
SELECT
1 AS id,
to_date ('01.01.2018 00:00:00','dd.MM.yyyy HH24:mi:ss') AS IncommingDate,
60 AS "Processing Time [sec.]"
FROM
dual
UNION ALL
SELECT
2,
to_date ('01.01.2018 00:05:00','dd.MM.yyyy HH24:mi:ss'),
60
FROM
dual
UNION ALL
SELECT
3,
to_date ('01.01.2018 00:05:30','dd.MM.yyyy HH24:mi:ss'),
60
FROM
dual
UNION ALL
SELECT
4,
to_date ('01.01.2018 00:10:00','dd.MM.yyyy HH24:mi:ss'),
60
FROM
dual
)
SELECT
*
FROM
example
你们中有人知道这样做吗?
答案 0 :(得分:1)
您似乎需要使用递归子查询分解:
with rcte (id, IncommingDate, ProcessingTime, ProcessingStart, ProcessingEnd) as (
select id,
IncommingDate,
ProcessingTime,
IncommingDate,
IncommingDate + (ProcessingTime/86400)
from example
where id = 1
union all
select e.id,
e.IncommingDate,
e.ProcessingTime,
greatest(e.IncommingDate, r.ProcessingEnd),
greatest(e.IncommingDate, r.ProcessingEnd) + (e.ProcessingTime/86400)
from rcte r
-- assumes IDs are the ordering criteris and are contiguous
join example e on e.id = r.id + 1
)
select * from rcte;
ID INCOMMINGDATE PROCESSINGTIME PROCESSINGSTART PROCESSINGEND
---------- ------------------- -------------- ------------------- -------------------
1 2018-01-01 00:00:00 60 2018-01-01 00:00:00 2018-01-01 00:01:00
2 2018-01-01 00:05:00 60 2018-01-01 00:05:00 2018-01-01 00:06:00
3 2018-01-01 00:05:30 60 2018-01-01 00:06:00 2018-01-01 00:07:00
4 2018-01-01 00:10:00 60 2018-01-01 00:10:00 2018-01-01 00:11:00
锚点成员的ID为1,可以对第一步进行简单的计算以获取开始/结束时间。
然后,递归成员找到下一个原始行,并使用greatest()
决定是基于传入时间还是上一个结束时间进行计算。
这假设顺序是基于ID的,并且它们是连续的。如果那不是您实际订购的方式,那只会更加复杂。