created: 2019-12-07T13:26:58.000Z

SQLで5分ごとの平均を出す

こんな2カラムがあるテーブルで5分ごとのdurationの平均とかMAXとかをサマりたい

  • duration
    • doubleが入っている
    • レスポンスを返すまでにかかった時間
  • utc_timestamp
    • timestampが入っている
    • アクセスされた時刻

SQL

prestoだとこんな感じ (datetimeがintに変換できればどのDBでもできる)

5分は300秒なので、datetimeをUNIXTIMEに変換して(intにして)
300でわった商が同じなら同じGROUPに入る

SELECT
  from_unixtime((CAST(to_unixtime(utc_timestamp) AS INTEGER) / 300) * 300) AT TIME ZONE 'Asia/Tokyo' window,
  AVG(duration), 
  MAX(duration),
  APPROX_PERCENTILE(duration, 0.98)  -- 98パーセンタイル
FROM lblog.api
GROUP BY
  CAST(to_unixtime(utc_timestamp) AS INTEGER) / 300
ORDER BY
  MIN(utc_timestamp)

パーセンタイルは他のDBだと工夫しないといけないかもしれない

参考

ビジネスダッシュボード 設計・実装ガイドブック 成果を生み出すデータと分析のデザイン
[ad] ビジネスダッシュボード 設計・実装ガイドブック 成果を生み出すデータと分析のデザイン
トレジャーデータ, 池田 俊介 (単行本(ソフトカバー))