2011-06-22 341 views
0

我有一個隨機生成的表。它有3列:P_Id,日期(插入行的日期)和文本。假設文本可以是各種動物。因此,該表可能看起來像需要mysql查詢幫助

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分鐘內的所有動物?例如,這裏的奶牛在其最近一次進入的最後30分鐘內發生了3次,這是在3點04分35秒,狗發生了兩次。鳥不會被選中,因爲它只發生過一次。

回答

2

總是有直接的方式(即使用子查詢提取的時間戳範圍,然後繼續像往常一樣):

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 
+0

+1尼斯你是怎樣使這似乎聲音有點簡單。 – stefgosselin

+1

你錯過了條款.. –

+1

@阿倫:對,謝謝。我在年輕時就指責早期的老生常談爭吵太多的SQL。 –

0
select animal, count(*) 
from MyTable 
where date >= (currentDate - 30 minutes) 
group by animal 
having count(*) >= 2 
+1

最後30分鐘「其最近一次入境的30分鐘內,」 ......不是內最後30分鐘 – Gerrat

0

形成稱爲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 
1

假設您檢查每個事件

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