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

グループの所属が前の行に依存している場合、postgresqlでグループにラベルを付ける方法は?

    「選択内の選択」 より一般的には「サブセレクト」または「サブクエリ」と呼ばれます。特定のケースでは、相関サブクエリです。 。 LATERAL 結合(postgres 9.3の新機能)は、相関サブクエリをより柔軟なソリューションに大幅に置き換えることができます:

    ここでも必要ないと思います。

    最初のケースの場合 ただし、このクエリはおそらくより高速で単純です。

    SELECT date, max(value) OVER (PARTITION BY grp) AS value
    FROM  (
       SELECT *, count(value) OVER (ORDER BY date) AS grp
       FROM   test_fill_null
       ) sub;
    

    count() null以外の値のみをカウントするため、grp null以外のvalueごとにインクリメントされます 、それによって必要に応じてグループを形成します。 1つを選ぶのは簡単です null以外のvalue grpごと 外側のSELECT

    2番目のケースの場合 、行の最初の順序は(id1, id2, tms)によって決定されると仮定します クエリの1つで示されているとおりです。

    SELECT id1, id2, tms
         , count(step) OVER (ORDER BY id1, id2, tms) AS group_id
    FROM  (
       SELECT *, CASE WHEN lag(tms, 1, '-infinity') OVER (PARTITION BY id1 ORDER BY id2, tms)
                           < tms - interval '5 min'
                      THEN true END AS step
       FROM   table0
       ) sub
    ORDER  BY id1, id2, tms;
    

    実際の注文に合わせてください。これらの1つがそれをカバーするかもしれません:

    PARTITION BY id1 ORDER BY id2  -- ignore tms
    PARTITION BY id1 ORDER BY tms  -- ignore id2
    

    SQLフィドル 拡張された例で。

    関連:



    1. SQLクエリの最適化:パフォーマンスを向上させるためのベストプラクティス

    2. ソケット'/var/lib/mysql/mysql.sock'を介してローカルMySQLサーバーに接続できません(2)

    3. ORA-01882:タイムゾーン領域が見つかりません

    4. MySQL GROUP&COUNT複数のテーブル