예전에는 테이블을 두번 읽어 처리하는 여러가지 방식을 사용했었지만...
지금은 분석함수(ROW_NUMBER) 사용하는게 깔끔하고 성능도 좋습니다.
-- 1. 상관관계 서브쿼리로 MAX 가져와 비교 SELECT a.* FROM tb a WHERE a.seq = (SELECT MAX(b.seq) FROM tb b WHERE b.beer = a.beer AND b.soju = a.soju ) ; -- 2. 그룹별 MAX 가져와 IN 조건으로 제공 SELECT * FROM tb WHERE (beer, soju, seq) IN (SELECT beer, soju , MAX(seq) FROM tb GROUP BY beer, soju ) ; -- 3. 인라인뷰 서브쿼리로 그룹별 MAX 가져와 조인 SELECT a.* FROM tb a , (SELECT beer, soju , MAX(seq) seq FROM tb GROUP BY beer, soju ) b WHERE b.beer = a.beer AND b.soju = a.soju AND b.seq = a.seq ; -- 4. NOT EXISTS 서브쿼리로 [더 큰 Seq 가 존재하지 않는 것] 가져오기 SELECT a.* FROM tb a WHERE NOT EXISTS (SELECT 1 FROM tb b WHERE b.beer = a.beer AND b.soju = a.soju AND b.seq >= a.seq ) ; -- 5. ROW_NUMBER 가 1 인 것만 추출 SELECT * FROM (SELECT a.* , ROW_NUMBER() OVER(PARTITION BY beer, soju ORDER BY seq DESC) rn FROM tb a ) WHERE rn = 1 ;