이것은 greatest-n-per-group
StackOverflow에서 정기적으로 나타나는 문제 의 예입니다 .
일반적으로 해결하는 것이 좋습니다.
SELECT c.*, p1.*
FROM customer c
JOIN purchase p1 ON (c.id = p1.customer_id)
LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND
(p1.date < p2.date OR (p1.date = p2.date AND p1.id < p2.id)))
WHERE p2.id IS NULL;
설명 : 행이 지정된 경우 동일한 고객 및 이후 날짜를 가진 p1
행이 없어야합니다 p2
(또는 관계가있는 경우 나중 id
). 이 사실을 발견하면 p1
해당 고객에 대한 가장 최근 구매입니다.
인덱스에 대해서, 나는에 복합 인덱스를 만들 것 purchase
열 이상 ( customer_id
, date
, id
). 이는 외부 색인이 포함 색인을 사용하여 수행되도록 할 수 있습니다. 최적화는 구현에 따라 다르므로 플랫폼에서 테스트해야합니다. RDBMS의 기능을 사용하여 최적화 계획을 분석하십시오. 예 EXPLAIN
를 들어 MySQL에서.
어떤 사람들은 위에서 보여준 솔루션 대신 하위 쿼리를 사용하지만 솔루션을 통해 관계를 쉽게 해결할 수 있습니다.