Нужна помощь с запросом MySQL - PullRequest
0 голосов
/ 22 июня 2011

У меня есть таблица, которая генерируется случайным образом.Он имеет 3 столбца: P_Id, дату (в которую была вставлена ​​строка) и текст.Допустим, в тексте могут быть разные животные.Таким образом, таблица может выглядеть так:

1      2011-06-15 03:04:05    cow  
2      2011-06-15 03:04:15    dog  
3      2011-06-15 03:04:19    bird  
4      2011-06-15 03:04:30    cow  
5      2011-06-15 03:04:30    dog  
6      2011-06-15 03:04:35    cow  
....  

Что такое запрос для выбора всех животных, которые произошли хотя бы дважды в течение последних 30 минут после последней записи?Например, здесь корова встречается 3 раза в течение последних 30 минут после ее последней записи, то есть в 3:04:35, и собака встречалась дважды.Птица не будет выбрана, поскольку это произошло только один раз.

Ответы [ 4 ]

2 голосов
/ 22 июня 2011

Всегда есть прямой путь (т. Е. Используйте подзапрос, чтобы извлечь диапазон меток времени, а затем продолжить как обычно):

select name, count(name)
from your_table
where created_at >= (
    select max(created_at) - INTERVAL 30 MINUTE
    from your_table
)
group by name
having count(name) >= 2
1 голос
/ 22 июня 2011

Предполагая, что вы проверяете последние 30 минут на событие

select name, count(name)
from your_table t1
join (
    select name, max(created_at) created_at
    from your_table t2
) on t1.name = t2.name
where datediff (minute,t1.created_at,t2.created_at)<=30
group by name
having count(name) >= 2
0 голосов
/ 22 июня 2011

Сформируйте внутреннюю таблицу с именем latest_animals, которая будет рассчитывать дату последней записи для каждого животного. Сформируйте еще одну внутреннюю таблицу с именем previous_animals, которая будет рассчитывать предыдущую дату последней записи для каждого животного.

Выполните левое соединение между этими двумя таблицами на основе имени животного и отфильтруйте запись на основе разницы во времени между двумя датами.

SELECT latest_animals.animal_name, TIME_DIFF(latest_animals.created_at, previous_animals.created_at) created_diff FROM

(
  SELECT animal_name, MAX(date) created_at FROM animals GROUP BY animal_name
) latest_animals
LEFT JOIN
(
  SELECT animal_name, MAX(date) created_at FROM animals GROUP BY animal_name WHERE id NOT IN
  (SELECT id, MAX(date) FROM animals GROUP BY animal_name)
) previous_animals
ON latest_animals.animal_name =  previous_animals.animal_name
WHERE created_diff > INTERVAL 30 MINUTE 
0 голосов
/ 22 июня 2011
select animal, count(*) 
from MyTable 
where date >= (currentDate - 30 minutes) 
group by animal
having count(*) >= 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...