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

ある列では異なるレコードを返しますが、別の列で並べ替えます

    DISTINCT ON

    DISTINCT ON 、そのためのサブクエリが必要です:

    SELECT *
    FROM  (
       SELECT DISTINCT ON (conversation_id) *
       FROM   message t
       ORDER  BY conversation_id, created_at DESC
       ) sub
    ORDER BY created_at DESC;
    

    サブクエリの順序は、 DISTINCT ONの列と一致する必要があります 句なので、目的の並べ替え順序に到達するには、外部クエリでラップする必要があります。

    row_number()の代替

    同様の話ですが、サブクエリも必要です:

    SELECT id, sender_id, receiver_id, conversation_id, subject, body, created_at
    FROM  (
       SELECT *, row_number() OVER (PARTITION BY conversation_id
                                    ORDER BY created_at DESC) AS rn
       FROM   message t
       ) sub
    WHERE  rn = 1
    ORDER  BY created_at DESC;
    

    また、おそらく遅いです。




    1. PGError:エラー:オブジェクトとそのhas_manyオブジェクトのARクエリのWHERE句で集計は許可されていません

    2. データベースmysqlデスクトップを使用したJavaアプリのデプロイ

    3. 大規模なMySQLInnoDBテーブルの変更

    4. Psycopg2:ストアドプロシージャPostgresでテーブルを作成します