我在MySQL中有一系列记录,代表设备的故障排除事件。我很有兴趣找到哪些设备在给定的时间跨度内有连续的故障排除事件。
例如,我想知道两个或更多故障排除事件何时在5天之内发生,但我不确定如何构建查询以列出所有设备。
我有两张类似的表:
devices
-----
id name
events
-----
id device_id datetime
使用此示例数据:
events
-----
id device_id datetime
--- --- ---
1 1 2011-01-01
2 1 2011-06-15
3 2 2011-06-18
4 1 2011-06-18
5 2 2011-06-20
我想构建一个提供结果的查询:
device_id event_id datetime
1 2 2011-06-15
1 4 2011-06-18
2 3 2011-06-18
2 5 2011-06-20
由于2011-01-01上的事件被隔离超过5天,因此应该省略。
我很感激如何解决这个问题。
答案 0 :(得分:0)
这是一个WAG。
select
device_id,
event_id,
datetime
from
events
where
device_id in
(
select
device_id
from
(
select
device_id,
count(device_id) event_count
from
events
group by
device_id
having
event_count > 1
)
)
order by
device_id,
event_id,
datetime
可能
where
event_count > 1
而不是拥有。
对于日期范围,将范围检查添加到最内层查询(具有count()的查询)。
例如,添加(从另一个答案剪断):
WHERE events.datetime BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 DAY) AND CURDATE()
答案 1 :(得分:0)
SELECT devices.`device_id`, events.`id` AS event_id, events.`datetime`
FROM devices
INNER JOIN events ON events.`id` = devices.`id`
WHERE events.`datetime` BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 DAY) AND CURDATE()
ORDER BY devices.`device_id` ASC
这将找到过去5天内发生过事件的所有设备。您可以将CURDATE()
替换为任何开始日期。