任何人都可以帮我解决以下请求
我有“开始时间”和“结束时间”的时间条目列表。 但在某些情况下,条目具有相同的“结束时间”和某些情况,条目落入同一时间的进入持续时间。
我需要从时间条目开始的持续时间,但是需要反映的持续时间没有重复的时间输入持续时间。意思是我需要一个持续时间,即使有许多条目具有不同的开始时间和结束时间。
请参阅以下内容。
情景1:
ID Log No Start time End time
5 1001 4/6/2014 6:34 4/6/2014 7:47
5 1001 4/6/2014 0:34 4/6/2014 0:47
5 1002 4/6/2014 0:09 4/6/2014 0:47
5 1000 4/5/2014 23:36 4/6/2014 0:47
5 1000 4/5/2014 23:16 4/6/2014 0:47
5 1008 4/5/2014 22:50 4/6/2014 0:47
5 1006 4/5/2014 22:41 4/6/2014 0:47
5 1010 4/5/2014 22:26 4/6/2014 0:47
5 1008 4/5/2014 22:50 4/6/2014 0:47
5 1006 4/5/2014 22:41 4/6/2014 0:47
5 1008 4/5/2014 22:26 4/6/2014 0:47
5 1003 4/5/2014 22:13 4/6/2014 0:47
5 1005 4/5/2014 22:01 4/6/2014 0:47
5 1010 4/5/2014 21:48 4/6/2014 0:47
5 1010 4/5/2014 17:48 4/5/2014 21:47
最终结果:(这些时间段的持续时间,因为它们在同一时段内落下)。结果/输出中可以忽略日志否 - 基本上日志没有关系。这是我想要的持续时间。
5 1001 4/6/2014 6:34 4/6/2014 7:47 1.22
5 1010 4/5/2014 21:48 4/6/2014 0:47 2.97
5 1010 4/5/2014 17:48 4/5/2014 21:47 3.97
情景2:
5 1002 4/4/2014 12:38 4/4/2014 15:45
5 1002 4/4/2014 7:47 4/4/2014 8:45
5 1000 4/4/2014 7:17 4/4/2014 7:20
5 1008 4/4/2014 7:15 4/4/2014 7:45
5 1003 4/4/2014 7:08 4/4/2014 7:28
5 1005 4/4/2014 7:05 4/4/2014 10:08
5 1005 4/4/2014 5:08 4/4/2014 8:06
最终结果:
5 1002 4/4/2014 12:38 4/4/2014 15:45 3.12
5 1005 4/4/2014 7:05 4/4/2014 10:08 3.06
5 1005 4/4/2014 5:08 4/4/2014 8:06 2.98
请注意,两种情况都可以在一组数据中使用。 请帮忙。
谢谢。
答案 0 :(得分:0)
你想要做的是"合并重叠的间隔"。如果你用谷歌搜索谷歌,你会发现很多答案。
也就是说,您可以执行以下操作,假设条目列表位于数组a
中,结果列表位于数组b
中,两者的长度均为> = n
是a
中的条目数:
伪代码
Sort a by start asc
i=0
r=0
while i<n
j = i+1
while j <n
if a(j).start <= a(i).end
a(i).end = max(a(i).end, a(j).end)
++j
else
exit while
endif
endwhile
b(r)=a(i)
++r
i=j
endwhile
答案 1 :(得分:0)
这是在某个地方吗?我简化了一点并从表达式中删除了id,因为所有行都具有相同的值:
with t (log_no, start, end) as (
values
(1001 ,timestamp('2014-04-06-06.34.00')
, timestamp('2014-04-06-07.47.00')),
(1001 ,'2014-04-06-00.34.00', '2014-04-06-00.47.00'),
(1002 ,'2014-04-06-00.09.00', '2014-04-06-00.47.00'),
(1000 ,'2014-04-05-23.36.00', '2014-04-06-00.47.00'),
(1000 ,'2014-04-05-23.16.00', '2014-04-06-00.47.00'),
(1008 ,'2014-04-05-22.50.00', '2014-04-06-00.47.00'),
(1006 ,'2014-04-05-22.41.00', '2014-04-06-00.47.00'),
(1010 ,'2014-04-05-22.26.00', '2014-04-06-00.47.00'),
(1008 ,'2014-04-05-22.50.00', '2014-04-06-00.47.00'),
(1006 ,'2014-04-05-22.41.00', '2014-04-06-00.47.00'),
(1008 ,'2014-04-05-22.26.00', '2014-04-06-00.47.00'),
(1003 ,'2014-04-05-22.13.00', '2014-04-06-00.47.00'),
(1005 ,'2014-04-05-22.01.00', '2014-04-06-00.47.00'),
(1010 ,'2014-04-05-21.48.00', '2014-04-06-00.47.00'),
(1010 ,'2014-04-05-17.48.00', '2014-04-05-21.47.00')
)
select log_no, min(start), end
from (
select log_no, start, min(t1.end) end
from t t1
where not exists (
select 1 from t t2
where t1.end <= t2.start and t1.end > t2.end
and t1.log_no = t2.log_no
and not (t1.start,t1.end) = (t2.start,t2.end)
)
group by log_no, start
) as u
group by u.log_no, end