我具有如下表结构,
personID | Starttime | Endtime EventID
---------| ------------------- | --------------------|---------
1 | 2011-12-03 01:00:00| 2011-12-03 04:00:00| 101
2 | 2011-12-22 09:00:00| 2011-12-22 09:30:00| 102
1 | 2011-12-03 02:00:00| 2011-12-03 02:30:00| 103
3 | 2012-01-02 07:00:00| 2012-01-02 07:00:00| 104
3 | 2012-01-25 16:30:00| 2012-01-25 13:50:36| 105
1 | 2011-12-03 03:00:00| 2011-12-03 04:00:00| 106
根据我的要求,一个人在特定时间段参加了一个活动。在上面的示例中,人员标识“ 1”应仅接受事件“ 101”。因为事件“ 101”的时间是12月03日的凌晨01点到凌晨04点。同一天的另一个事件是“ 103&106”。这两个事件的时间都介于“ 101”的事件时间之间。
我需要一个查询来标识开始时间和结束时间的重复项是否在现有的开始时间和结束时间之下。我该如何使用SQL查询来识别事件101的重复事件条目103和106。
我的预期结果是
personID | Starttime | Endtime EventID
---------| ------------------- | --------------------|---------
1 | 2011-12-03 02:00:00| 2011-12-03 02:30:00| 103
1 | 2011-12-03 03:00:00| 2011-12-03 04:00:00| 106
答案 0 :(得分:0)
您可以通过将表与其自身连接来实现此目的。下面的查询将返回位于另一个事件内并与包含事件分配给同一个人的所有事件;如果要返回包含事件的详细信息,则可以使用SELECT yourtablename.*
代替SELECT subset.*
。
select subset.*
from yourtablename
join yourtablename subset
on subset.personID=yourtablename.personID
and subset.EventID <> yourtablename.EventID
and subset.Starttime >= yourtablename.Starttime
and subset.Endtime <= yourtablename.Endtime