php - MySQL 查询以最大 event_count 分组?

标签 php mysql sql

我需要计算事件组之间的时间差。每个“事件组”在 event_count 列 = 1 时重新开始,最大 event_count 可以是大于 1 的任何数字。

我如何在 MySQL 中执行此操作?

这是表格和一些测试数据:

表格

CREATE TABLE `monitoring` ( 
  `event_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  `hosting_id` char(36) DEFAULT NULL, 
  `event_timestamp` datetime DEFAULT NULL, 
  `event_type` tinyint(3) unsigned DEFAULT NULL, 
  `event_count` int(6) DEFAULT NULL, 
  `session` varchar(36) DEFAULT NULL, 
  PRIMARY KEY (`event_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=1765 DEFAULT CHARSET=utf8;

测试记录:

INSERT INTO `monitoring` (`event_id`, `hosting_id`, `event_timestamp`, `event_type`, `event_count`, `session`)
VALUES
    (1753,'97948a60-2e44-d39c-bb02-506c80c97df4','2013-10-23 20:01:19',1,1,NULL),
    (1711,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:02:20',1,1,NULL),
    (1712,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:02:26',1,2,NULL),
    (1713,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:02:30',1,3,NULL),
    (1714,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:02:33',1,4,NULL),
    (1715,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:02:45',1,5,NULL),
    (1716,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:02:48',1,6,NULL),
    (1717,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:02:51',1,7,NULL),
    (1718,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:29',1,1,NULL),
    (1719,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:31',1,2,NULL),
    (1720,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:33',1,3,NULL),
    (1721,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:35',1,4,NULL),
    (1722,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:38',1,5,NULL),
    (1723,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:40',1,6,NULL),
    (1724,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:43',1,7,NULL),
    (1725,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:46',1,8,NULL),
    (1726,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:48',1,9,NULL),
    (1727,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 16:49:50',1,10,NULL),
    (1754,'988df609-4ae4-3062-6361-4fd2665cfb42','2013-10-24 02:48:32',1,1,NULL),
    (1729,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:02:28',1,1,NULL),
    (1730,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:03:25',1,2,NULL),
    (1731,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:03:30',1,3,NULL),
    (1732,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:05:42',1,4,NULL),
    (1733,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:06:03',1,5,NULL),
    (1758,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-24 12:23:43',1,1,NULL),
    (1757,'d425f99b-0812-5902-37da-4fd266c64545','2013-10-24 08:16:26',1,1,NULL),
    (1756,'20e00e08-459b-b229-d341-4fd266c23df1','2013-10-24 06:32:10',1,1,NULL),
    (1738,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:09:02',1,1,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1739,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:09:04',1,2,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1740,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:09:06',1,3,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1741,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:09:07',1,4,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1742,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:09:08',1,5,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1743,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:09:09',1,6,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1755,'988df609-4ae4-3062-6361-4fd2665cfb42','2013-10-24 06:30:20',1,1,NULL),
    (1745,'a9e17a2a-42d9-979f-0484-4fd2665b487a','2013-10-23 17:09:28',1,1,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1746,'a9e17a2a-42d9-979f-0484-4fd2665b487a','2013-10-23 17:09:38',1,2,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1747,'a9e17a2a-42d9-979f-0484-4fd2665b487a','2013-10-23 17:09:55',1,3,'5c31a1eb481bf9e0753f9a25538b0257'),
    (1748,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:13:54',1,1,NULL),
    (1749,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:13:56',1,2,NULL),
    (1750,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:13:58',1,3,NULL),
    (1751,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-23 17:14:00',1,4,NULL),
    (1752,'ecd5f06a-7b82-4cc8-deb2-4fd266eeec3e','2013-10-23 19:06:42',1,1,NULL),
    (1759,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-24 12:23:48',1,2,NULL),
    (1760,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-24 12:23:51',1,3,NULL),
    (1761,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-24 12:23:53',1,4,NULL),
    (1762,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-24 12:23:56',1,5,NULL),
    (1763,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-24 12:23:58',1,6,NULL),
    (1764,'c47204d5-d682-9ba4-b8b6-4fd26660651a','2013-10-24 12:24:23',1,7,NULL);

我的目标是:

On 10-23-2013 down for 31 seconds 
On 10-23-2013 down for 21 seconds 
On 10-23-2013 down for 215 seconds
    etc...

一旦我能正确地计算出这个查询,我就会这样做。

到目前为止我的查询是:

SELECT min(date(`event_timestamp`)) as EventGroupDate, (max(`event_timestamp`) - min(`event_timestamp`)) HowLong
FROM (
    SELECT `event_timestamp`, @eventGroup := @eventGroup + (`event_count` = 1) eventGroup
    FROM `monitoring`, (SELECT @eventGroup := 0) init
    WHERE `hosting_id` = 'c47204d5-d682-9ba4-b8b6-4fd26660651a'
    ORDER BY `event_timestamp`
) s
GROUP BY eventGroup

但计算错误。具体计算如下

我会发布更新。

每个事件组event_count = 1 开始,可以以任何大于 1 的数字结束。因为这需要按 event_timestamp 可以假设所有介于两者之间的都可以被认为是一个组。例如:记录 ID 1711-1717 将是第 1 组,1718-1727 将是第 2 组,依此类推...

准确的结果应该是:

31
21
215
7
6
40

用给定的数据

最佳答案

试试这个:

SELECT
  min(date(event_timestamp)) aDay,
  max(UNIX_TIMESTAMP(event_timestamp)) - min(UNIX_TIMESTAMP(event_timestamp)) secondDiff
FROM (
  SELECT event_timestamp, @eventGroup := @eventGroup + (event_count = 1) eventGroup
  FROM monitoring, (SELECT @eventGroup := 0) init
  WHERE hosting_id = 'c47204d5-d682-9ba4-b8b6-4fd26660651a'
  ORDER BY event_timestamp
) s
GROUP BY eventGroup

输出:

|             ADAY | SECONDDIFF |
|------------------|------------|
| October, 23 2013 |         31 |
| October, 23 2013 |         21 |
| October, 23 2013 |        215 |
| October, 23 2013 |          7 |
| October, 23 2013 |          6 |
| October, 24 2013 |         40 |

fiddle here .

关于php - MySQL 查询以最大 event_count 分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19567948/

相关文章:

php - Symfony 第一页 - 自动加载器预期的类 […] 将在文件中定义

php - sql 计算来自特定字段的唯一值

mysql - 从 Java Servlet 打印 MySQL 查询结果到 JSP

php - 显示用户个人资料页面 PHP

php - mysql准备语句参数和排序查询

mysql - MySQL 和 MS SQL 语言之间的主要区别是什么?

MySQl 查询给出错误结果

php - 如何在 Cloud SQL 实例中设置授权 App Engine 应用程序

php - 如何防止服务器重载?

mysql - SQL Server 如何创建带空格的列名