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

MySQL/Postgresクエリの5分間隔データ

    再帰CTE

    各行は前の行に依存しているため、セットベースのアプローチで解決するのは困難です。 再帰CTE に頼る (これは標準SQLです):

    WITH RECURSIVE cte AS (
       (SELECT ts FROM tbl
        ORDER  BY ts
        LIMIT  1)
    
       UNION ALL
       (SELECT t.ts
        FROM   cte c
        JOIN   tbl t ON t.ts >= c.ts + interval '5 min'
        ORDER  BY t.ts
        LIMIT  1)
       )
    SELECT * FROM cte ORDER BY ts;
    

    最初のドラフトからの更新に注意してください。
    再帰CTEでは集計関数は許可されていません。 ORDER BYに置き換えました / LIMIT 1インデックスでサポートされている場合は高速である必要があります tsで 。

    UNIONの各脚を囲む括弧 LIMITを許可するにはクエリが必要です 、それ以外の場合は、UNIONの最後に1回だけ許可されます クエリ。

    PL/pgSQL関数

    ソートされたテーブルを反復処理する手続き型ソリューション(plpgsql関数を使用した例)は、単一のテーブルスキャンで実行できるため、おそらくはるかに高速です。

    CREATE OR REPLACE FUNCTION f_rowgrid(i interval)
      RETURNS SETOF timestamp AS
    $func$
    DECLARE
       _this  timestamp;
       _last  timestamp := '-infinity';     -- init so that 1 row passes
    BEGIN
    
    FOR _this IN
        SELECT ts FROM tbl ORDER BY 1
    LOOP
        IF _this >= _last + i THEN
           RETURN NEXT _this;
           _last := _this;
        END IF;
    END LOOP;
    
    END
    $func$ LANGUAGE plpgsql;
    

    電話:

    SELECT * FROM  f_rowgrid('5 min')
    

    SQLフィドル 両方を示しています。

    このタイプのplpgsql関数のやや複雑な例を次に示します。

    動的SQLとEXECUTEを使用して簡単に汎用化できます 任意のテーブルで機能します。




    1. Oracle SQL:Selectステートメントを使用した挿入でシーケンスを使用

    2. dblink.sqlを使用してPostgreSQLの2つのテーブル間でデータをコピーします

    3. MySQLで使用可能な文字セットのリストを返す方法

    4. 日付からミリ秒/ミリ秒から日付