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

Postgresql SQL GROUP BYの時間間隔(ミリ秒まで)

    generate_series()によって作成された間隔を追加することにより、「バケット」のテーブルを生成できます。このSQLステートメントは、初日の5分のバケットのテーブルを生成します(min(measured_at)の値 )データ内。

    select 
      (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,
      (select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
    from generate_series(0, (24*60), 5) n
    

    ラップ 共通テーブル式のステートメント。ベーステーブルであるかのように結合してグループ化できます。

    with five_min_intervals as (
      select 
        (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,
        (select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
      from generate_series(0, (24*60), 5) n
    )
    select f.start_time, f.end_time, avg(m.val) avg_val 
    from measurements m
    right join five_min_intervals f 
            on m.measured_at >= f.start_time and m.measured_at < f.end_time
    group by f.start_time, f.end_time
    order by f.start_time
    

    任意の秒数によるグループ化も同様です。date_trunc()を使用してください。 。

    generate_series()のより一般的な使用法により、5分のバケットの上限を推測することを回避できます。実際には、おそらくこれをビューまたは関数として作成します。ベーステーブルからパフォーマンスが向上する可能性があります。

    select 
      (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,
      (select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
    from generate_series(0, ((select max(measured_at)::date - min(measured_at)::date from measurements) + 1)*24*60, 5) n;
    


    1. MariaDBでサポートされている文字セットの完全なリスト

    2. Oracle Date TO_CHAR('Month DD、YYYY')に余分なスペースがあります

    3. MariaDB JSON_KEYS()の説明

    4. PostgreSQLはテーブル(フラグメント)の透過的な圧縮をサポートしていますか?