如何在Oracle SQL中解决这个问题?
1.我有专栏 Event_Min_DateTime (例如01/06/2017 7:30:00)& Event_ID 的 Event_Max_datetime (例如03/06/2017 18:30:00)(例如ev001)。因此,计算后的列 Event_minutes 可以创建为( Event_Max_datetime - Event_Min_DateTime )* 24 * 60。
现在,如何计算列 Daily_portion_within ( Event_minutes 的一部分属于 Daily_Window_minutes )和 Daily_portion_outside ( Event_minutes 的一部分超出 Daily_Window_minutes 但在同一 Daily_Date 内)?
答案 0 :(得分:0)
从问题中不清楚Daily_Window_Start是否可以> Event_Min_DateTime,所以在这里我考虑过只写这样的情况。此外,由于您的问题并未显示列的数据类型,因此未应用转换。您可以在Daily_Window_Start>的类似行上编写查询。 Event_Min_DateTime如下所示。然而,这里有许多假设。
SELECT
CASE
WHEN e. event_max_datetime <= d.daily_window_end THEN (e.event_max_datetime - e.event_min_datetime)*24*60
ELSE (d.daily_window_end - e.event_min_datetime)*24*60
END daily_portion_within ,
CASE
WHEN e. event_max_datetime <= d.daily_window_end THEN NULL
ELSE ( e.event_max_datetime - d.daily_window_end)*24*60
END daily_portion_outside
FROM (
SELECT Trunc(event_max_datetime) dt ,
event_min_datetime ,
event_max_datetime
FROM EVENTS ) EVENTS e,
daily_window d
WHERE e.dt = trunc(d.dt)
答案 1 :(得分:0)
这个例子应该有所帮助:
select trunc(d1) as day, inside, (d2 - d1) * 24 * 60 - inside as outside
from (select e.*, d.*,
case when d2 < e1 or e2 < d1 then 0
else least(e2, d2) - greatest(e1, d1)
end * 24 * 60 as inside
from e cross join d)
数据:
create table e (id number(3), e1 date, e2 date);
insert into e values(1, timestamp '2017-06-01 07:30:00', timestamp '2017-06-03 18:30:00');
create table d (d1 date, d2 date);
insert into d values(timestamp '2017-06-01 06:00:00', timestamp '2017-06-01 15:30:00');
insert into d values(timestamp '2017-06-02 09:30:00', timestamp '2017-06-02 22:30:00');
insert into d values(timestamp '2017-06-03 12:05:00', timestamp '2017-06-03 19:45:00');
insert into d values(timestamp '2017-06-04 15:00:00', timestamp '2017-06-04 16:30:00');
结果:
DAY INSIDE OUTSIDE
----------- ---------- ----------
2017-06-01 480 90
2017-06-02 780 0
2017-06-03 385 75
2017-06-04 0 90