2011-06-22 245 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