0

我需要一个特定的查询组。我有一个包含(标题、开始、结束)字段的事件列表我想获得一个事件标题、编号、第一个和最后一个事件行,按标题和随后的开始结束日期时间分组(例如 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)

有可能吗?谢谢你。

4

2 回答 2

0

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

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

于 2013-07-15T10:52:57.443 回答
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
于 2013-07-15T10:54:25.013 回答