2013-10-24 6 views
6

イベントのグループ間の時間差を計算する必要があります。各「イベントグループ」は、event_countの列が1のときに開始され、最大event_countは1より大きい任意の数値になることができます。MySQL最大event_countでグループにクエリしますか?

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として開始し、これはその間のすべてのグループと考えることができることが想定できるevent_timestampによってソートする必要があるので、任意の数より大きい1で終了することができます。例えば:レコードIDは1711から1717は、グループ1、1718から1727は、ように等、グループ2となるであろう...

正確な結果がなければならない:指定されたデータと

31 
21 
215 
7 
6 
40 

+0

集計関数を使用している場合は、グループとして返​​されたレコードセット全体を処理するため、「GROUP BY」ステートメントを使用しないと、単一のレコードしか取得できません。 – Orbling

+0

あなたの入力に基づいて予想される出力を詳細に追加できますか?ほんの数行で 'X'を実際の数に一致させるのに役立ちます。 –

+0

なぜ正確な数字が問題になるのかわかりません(テストデータがそこにあると見ています...)、とにかくそれを追加しました。 – Kevin

答えて

2

これを試してみてください:

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 | 

フィドルhere

+0

それらの結果も同様に、正しく見えます。実際のデータをチェックして確認するには1分してください。ええ、私は 'CONCAT_WS'を取り除きましたが、まだ小数点を取得しています...それほど大きな問題ではありません;) – Kevin

+0

残りの列を出力するにはどうしたらいいですか?私は 'session'と' event_type'カラムも必要です... – Kevin

+0

nah。結果は正しくありません。私は質問に入れるべきものを投稿します – Kevin

関連する問題