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

異なるORDERBYのPostgreSQLDISTINCTON

    ドキュメントによると:

    DISTINCT ON(expression [、...])は、指定された式が等しいと評価される行の各セットの最初の行のみを保持します。 [...] ORDER BYを使用して目的の行が最初に表示されるようにしない限り、各セットの「最初の行」は予測できないことに注意してください。 [...] DISTINCT ON式は、左端のORDERBY式と一致する必要があります。

    公式ドキュメント

    したがって、address_idを追加する必要があります 注文に応じて。

    または、各address_idの最新の購入商品を含む行全体を検索する場合 その結果はpurchased_atで並べ替えられます 次に、次のアプローチで解決できるグループあたりの最大Nの問題を解決しようとしています。

    ほとんどのDBMSで機能する一般的なソリューション:

    SELECT t1.* FROM purchases t1
    JOIN (
        SELECT address_id, max(purchased_at) max_purchased_at
        FROM purchases
        WHERE product_id = 1
        GROUP BY address_id
    ) t2
    ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
    ORDER BY t1.purchased_at DESC
    

    @hkfの回答に基づく、よりPostgreSQL指向のソリューション:

    SELECT * FROM (
      SELECT DISTINCT ON (address_id) *
      FROM purchases 
      WHERE product_id = 1
      ORDER BY address_id, purchased_at DESC
    ) t
    ORDER BY purchased_at DESC
    

    ここで問題が明確になり、拡張され、解決されました:ある列で順序付けられ、別の列で区別される行を選択する



    1. MySQLで現在の日付と時刻を取得する方法

    2. ORA-00972識別子が長すぎますエイリアス列名

    3. データベース(モデル)をクエリするためのDjangoフォーム

    4. Oracleによるページング