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

指定された時間の5分ごとのデータの平均

    間隔にグループ化

    group byを使用する必要があります 平均化する間隔ごとに1つのグループを作成します。

    select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
    from Databasename.tablename 
    where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
    group by datetime div 500
    

    これは、日付と時刻を暗黙的に数値に変換できるという事実を利用しています。数値は、YYMMDDhhmmssの形式になります。 。このような数値を100で割ると秒が削除され、同様に500で割ると、5分間隔ごとに一意の数値が得られます。

    私が選択した追加の列は、間隔の中央を示します。間隔からいつでも(ここでは最小値を選択しますが、実際には重要ではありません)、その5分の間隔の数値に変換され、日付と時刻に戻ります。数を追加し、2分半を追加します。同様の構文を使用して先頭を計算することもできます(+ 230をそのままにしておくだけです out)または(包括的)end(+ 459 )間隔の。

    sqlfiddle を使用してテスト済み 。

    範囲の終わりの処理

    BETWEENに注意してください 範囲には、15:30:00からの行が含まれます しかし、その間隔から他の人はその時に開始しませんでした。範囲の終わりを選択から除外したい場合があります:

    where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
    

    NULLになる理由

    クエリがNULLを生成する理由について :区間演算を行うには、区間全体を引用符で囲むのではなく、時間単位に単一の名前を使用します。つまり

    '2012-09-08 15:30:00' + INTERVAL 5 minute
    

    ただし、これは範囲を2012-09-08 15:35:00に拡張するだけです。 それでも、必要な5分間隔を作成しないでください。あなたが書いた方法では、2つの文字列を追加しようとしています。これは、文字列を数値に変換できない限り、MySQLでは不可能です。数値に変換できる場合は、それらの数値が追加されます。

    区間演算を使用して、区間の排他的な終了、つまりの最初の秒を計算することをお勧めします。 間隔:

     convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
    

    500を追加するだけです 230の代わりに 結果の数値は、各時間の最後の間隔で無効な日付を表す可能性があるため、クエリの一部は機能しません。




    1. Postgresqlでアップサートを実行しているときにONCONFLICT句で部分インデックスが使用されない

    2. PostgreSQLを使用する1つのエンティティ用の複数のHibernateシーケンスジェネレータ

    3. PostgreSQLでパターンを照合しながら文字列をエスケープする方法

    4. 偽の外部キー制約が失敗する