ドキュメンテーションは言う:
DISTINCT ON(expression [、...])は、指定された式が等しいと評価された各行セットの最初の行のみを保持します。[...]目的の行が最初に表示されるようにするためにORDER BYを使用しない限り、各セットの「最初の行」は予測できないことに注意してください。[...] DISTINCT ON式は、左端のORDER BY式と一致する必要があります。
公式ドキュメント
したがって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
ここで問題の明確化、拡張、解決:ある列で順序付けられ、別の列で区別される行の選択