설명서에 따르면 :
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
문제를 명확하게 설명하고 확장하고 해결했습니다. 일부 열별로 정렬되고 다른 열에서 구별되는 행 선택