sql >> データベース >  >> RDS >> Mysql

時間間隔データのMySqlクエリヒストグラム

    必要なレベルで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);
    

    また、このテーブルの開始列にインデックスがある場合、これらのクエリは数億行であってもすぐに完了します。

    お役に立てれば!これについて他にご不明な点がありましたらお知らせください。



    1. MySQLの作成関数はセットを返しません

    2. dbWriteTable(...、append =T)はRで上書きされます

    3. Mysql-Y-m-d形式で月ごとにグループ化

    4. SQLiteの既存のテーブルに列を追加する