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

2つのフィールドに2つの配列を作成し、配列の並べ替え順序を同期させます(サブクエリなし)

    列名を変更しましたgroup grpgroup 予約語 です。 PostgresおよびすべてのSQL標準で使用されており、識別子として使用しないでください。

    私はあなたの質問を次のように理解しています:

    2つの配列を同じ並べ替え順序で並べ替えて、同じ要素の位置が両方の配列の同じ行に対応するようにします。

    サブクエリを使用する またはCTE 集計する前に行を並べ替えます。

    SELECT id, array_agg(grp) AS grp, array_agg(dt) AS dt
    FROM  (
        SELECT *
        FROM   tbl
        ORDER  BY id, grp, dt
        ) x
    GROUP  BY id;
    

    それは速い 個別の ORDER BYを使用するよりも 集計関数の句 array_agg() @Mostyのデモ のように (そしてこれはPostgreSQL 9.0以来存在しています)。また、ほとんどの場合、質問の解釈が異なり、適切なツールを使用して解釈します。

    ORDER BYです サブクエリで安全ですか?

    マニュアル:

    そうです、この例では安全です。

    サブクエリなし

    本当に必要の場合 サブクエリなしのソリューション 、次のことができます:

    SELECT id
         , array_agg(grp ORDER BY grp)
         , array_agg(dt  ORDER BY grp, dt)
    FROM   tbl
    GROUP  BY id;
    

    ORDER BY grp, dtに注意してください 。 dtで並べ替えます 結びつきを断ち切り、ソート順を明確にすることに加えて。 grpには必要ありません 、しかし。

    ウィンドウ関数<を使用して、これを行うまったく異なる方法もあります。 / a> :

    SELECT DISTINCT ON (id)
           id
         , array_agg(grp) OVER w AS grp
         , array_agg(dt)  OVER w AS dt
    FROM   tbl
    WINDOW w AS (PARTITION BY id ORDER BY grp, dt
                 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
    ORDER  BY id;
    

    DISTINCT ON (id)に注意してください DISTINCTだけでなく これは同じ結果を生成しますが、追加の並べ替えが必要ないため、1桁高速に実行されます。

    私はいくつかのテストを実行しましたが、これは他の2つのソリューションとほぼ同じ速さです。予想通り、サブクエリバージョンは依然として最速でした。 EXPLAIN ANALYZEでテストする 自分の目で確かめてください。



    1. MySQLデータベース内のすべてのトリガーをどのようにリストしますか?

    2. OracleAPEX-SQL-シーケンシャル履歴の作成と各フェーズ間の日数の計算

    3. Pythonとpsycopg2を使用してCSVをpostgresにインポートするときにエラーが発生しました

    4. Play Framework 2.0 JPA Mysqlエラー:EntityManagerFactoryをビルドできません