必要なレベルでgroupbyを使用してこれを行うことができます。提供したデータを使用した例を次に示します。
最初にSQLを使用してテーブルを作成し、データを入力します。ここのID列は「必要」ではありませんが、テーブルが大きい場合やインデックスがある場合に推奨されます。
CREATE TABLE `test`.`events` (
`id` INT NOT NULL AUTO_INCREMENT,
`user` INT NULL,
`start` DATETIME NULL,
`end` DATETIME NULL,
`type` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
INSERT INTO events (user, start, end, type) VALUES
(1, '2015-1-1 12:00:00', '2015-1-1 12:03:59', 'browsing'),
(2, '2015-1-1 12:03:00', '2015-1-1 12:06:00', 'browsing'),
(2, '2015-1-1 12:03:00', '2015-1-1 12:06:00', 'eating'),
(3, '2015-1-1 12:03:00', '2015-1-1 12:08:00', 'browsing');
イベント数に対する分数の順序対のリストを取得するには:
次に、以下に示すように、timestampdiff関数を使用してクエリを簡単に記述できます。
SELECT
TIMESTAMPDIFF(MINUTE, start, end) as minutes,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)
出力:
minutes numEvents
3 3
5 1
選択の最初のパラメーターは、FRAC_SECOND、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER、またはYEARのいずれかです。
実行できるクエリの例をさらにいくつか示します。
時間ごとのイベント(床関数が適用されます)
SELECT
TIMESTAMPDIFF(HOUR, start, end) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
**より適切なフォーマットでの時間ごとのイベント**
SELECT
CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
さまざまなオプションでグループ化できますが、これで確実に開始できます。ほとんどのプロットパッケージでは、任意のx y座標を指定できるため、x軸の値が欠落していることを心配する必要はありません。
特定の時間におけるイベント数の順序対のリストを取得するには(ロギング用): これは参照用に残されていることに注意してください。
さて、クエリについて。まず、グループ化に使用するアイテムを選択する必要があります。たとえば、タスクに1分以上かかる場合があるため、開始と終了は異なる分になります。これらすべての例では、イベントが実際に行われた時間であるため、開始時間に基づいています。
イベントカウントを分ごとにグループ化するには、次のようなクエリを使用できます:
SELECT
DATE_FORMAT(start, '%M %e, %Y %h:%i %p') as minute,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start), HOUR(start), MINUTE(start);
これが、年から始まり、分ごとに、すべての項目でどのようにグループ化されているかに注意してください。議事録もラベルで表示しています。結果の出力は次のようになります:
minute numEvents
January 1, 2015 12:00 PM 1
January 1, 2015 12:03 PM 3
これは、phpを使用して取得し、そこにある多くのグラフ作成ライブラリの1つで表示できるように準備し、x軸に分列をプロットし、y軸にnumEventsをプロットできるデータです。
実行できるクエリの例をさらにいくつか示します。
時間別のイベント
SELECT
DATE_FORMAT(start, '%M %e, %Y %h %p') as hour,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start), HOUR(start);
日付別のイベント
SELECT
DATE_FORMAT(start, '%M %e, %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);
月ごとのイベント
SELECT
DATE_FORMAT(start, '%M %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start);
年ごとのイベント
SELECT
DATE_FORMAT(start, '%Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start);
また、このテーブルの開始列にインデックスがある場合、これらのクエリは数億行であってもすぐに完了します。
お役に立てれば!これについて他にご不明な点がありましたらお知らせください。