그룹화된 항목 중 최대값만 가져오려고 합니다. 0 3 1,309

by 돝돝 [Oracle 기초] [2016.02.26 08:56:50]


안녕하세요. 초보가 질의 하나 올립니다...
 
테이블 TB에 BEER, SOJU, SEQ 라는 3 개의 키가 있는데요.
이를 A,B의 각 SEQ가 최대인 값들을 가져오려고 합니다.
 
이를 위해
-----------------------------------------------------------
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 )
------------------------------------------------------------
저는 이렇게 하는데요, 이것 말고 또 다른 방법이 있을까요?
by 우리집아찌 [2016.02.26 09:04:50]
SELECT BEER, SOJU, MAX(SEQ)
  FROM TB
 GROUP BY BEER, SOJU 

 


by swlee710 [2016.02.26 09:11:19]
select *
from (
         select beer, soju, seq
                  , row_number() over(order by seq desc) rn
         from tb a
         )
where rn = 1

 


by 마농 [2016.02.26 09:40:43]

예전에는 테이블을 두번 읽어 처리하는 여러가지 방식을 사용했었지만...
지금은 분석함수(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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입