Mysql组由后续

时间:2013-07-15 10:17:56

标签: mysql datetime group-by

我需要一个特定的群组来查询。 我有一个事件列表(标题,开始,结束)字段 我希望得到一个事件标题,编号,第一个和最后一个事件行按标题分组和后续开始结束日期时间稍微松弛(例如15分钟)。

例如:

create table events(
  id int auto_increment,
  title varchar(50),
  start datetime,
  end datetime
);

insert into events values
('Title1','2013-07-15 12.00','2013-07-15 13.00'),
('Title2','2013-07-15 12.00','2013-07-15 13.00'),
('Title1','2013-07-15 13.15','2013-07-15 14.15'),
('Title1','2013-07-15 14.30','2013-07-15 15.30'),
('Title1','2013-07-15 19.00','2013-07-15 21.00');

结果应为:

'Title1', 3, '2013-07-15 12.00','2013-07-15 15.30'
'Title2', 1, '2013-07-15 12.00','2013-07-15 12.00'
'Title1', 1, '2013-07-15 19.00','2013-07-15 19.00' (not susequent [+/- 15min] with first group)

可能吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

不,不幸的是,SQL不那么灵活。

您需要存储过程或完全选择并解决应用程序级别的问题。

答案 1 :(得分:0)

这是一个复杂的查询。

这个想法是定义序列的开始位置 - 也就是说,每个记录在前一个记录之后超过15分钟。然后,对于每个记录,计算此前记录的数量。这为每个序列提供了“组标识符”。

MySQL中的计算涉及相关子查询(或具有聚合的非等值连接)。最里面计算StartGroup,它们是序列开始的记录。下一级对这些组标识符进行求和:

select grp, title, count(*), min(start), max(end)
from (select e.*,
             (select sum(StartGroup)
              from (select e.*,
                           (select (case when e1.end < e.start - interval 15 minute
                                         then 1 end)
                            from events e1
                            where e1.title = e.title and
                                  e1.end < e.start 
                            order by e1.end desc
                            limit 1
                           ) as StartGroup
                    from events e
                   ) e2
              where e2.title = e.title and
                    e2.start <= e.start
             ) as grp
      from events e
     ) e
group by grp, title