如何查找重复的时间条目和重复的持续时间 - SQL

时间:2014-05-10 01:28:51

标签: sql time duration

任何人都可以帮我解决以下请求

我有“开始时间”和“结束时间”的时间条目列表。 但在某些情况下,条目具有相同的“结束时间”和某些情况,条目落入同一时间的进入持续时间。

我需要从时间条目开始的持续时间,但是需要反映的持续时间没有重复的时间输入持续时间。意思是我需要一个持续时间,即使有许多条目具有不同的开始时间和结束时间。

请参阅以下内容。

情景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

请注意,两种情况都可以在一组数据中使用。 请帮忙。

谢谢。

2 个答案:

答案 0 :(得分:0)

你想要做的是"合并重叠的间隔"。如果你用谷歌搜索谷歌,你会发现很多答案。

也就是说,您可以执行以下操作,假设条目列表位于数组a中,结果列表位于数组b中,两者的长度均为> = na中的条目数:

伪代码

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