2017-05-09 5 views
0

status_tableに入れられる日のデータの間に、次のような問題がある(これは私がより組織的にデータを入れたい夜の間に4000件のエントリー日[集計データ

まで到達することができますストレージテーブル (status_table_storage)を削除してstatus_tableから削除してください。 考えられるのは、ステータス/エラーが変更されるまで同じステータスのすべてのエントリをグループ化し、新しいグループのそのポイントからテーブルの例は、フィドルで見つけることができます

テーブル構造の例をここで見つけることができます:ステップの説明によるhttp://sqlfiddle.com/#!9/488524/1

答えて

1

ステップ:

まず、名前とタイムスタンプでテーブルを注文し、3 user-defined variablesを初期化します。

SELECT s.* FROM status_table s 
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery 
ORDER BY name, timestamp 

ご覧のとおり、サブクエリを使用できます。 ORDER BYは重要です。なぜなら、指定しない限り、リレーショナルデータベースに順序がないからです。

ここで、MySQLは指定された順序でSELECT句を評価します。したがって、ここでは順序を変更しないでください。あなたはこの文を実行すると

SELECT 
s.*, 
@prevName, 
@prevStatus, 
@prevName := s.name, 
@prevStatus := s.status 
FROM status_table s 
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery 
ORDER BY name, timestamp 

、あなたはそれが読まれた最初の行、だときに我々は単に、彼らが前の行の値を保持する変数またはNULLを選択したときにすることを、見ることができます。次に、現在の行の値が変数に割り当てられます。したがって、現在の行を前の行と比較することができます。何かが変更された場合は、3番目の変数を増やします。これは、作成している各「グループ」の番号です。

SELECT 
s.*, 
@group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number, 
@prevName := s.name, 
@prevStatus := s.status 
FROM status_table s 
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery 
ORDER BY name, timestamp 

それが変化しないように何かが、そうでない場合は、それ自体に変数を変更し、割り当てられたときに、私たちは@group_numberをインクリメント。

これで、このクエリをサブクエリとして使用し、簡単なグループ化を行うことができます。

SELECT 
group_number AS id, 
name, 
status, 
MIN(error) AS error, 
MIN(timestamp) AS firstEntry, 
MAX(timestamp) AS lastEntry, 
COUNT(*) AS entries 
FROM (
    SELECT 
    s.*, 
    @group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number, 
    @prevName := s.name, 
    @prevStatus := s.status 
    FROM status_table s 
    , (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery 
    ORDER BY name, timestamp 
) sq 
GROUP BY 
group_number, 
name, 
status 
+0

で作業どういたしまして良い説明 –

+0

てくれてありがとうを参照してください。 – fancyPants