[오라클]중복값 제거 후 큰값 0 6 5,559

by machinehot [Oracle 기초] 중복값. 제거 그룹별 최대값 [2017.09.26 17:18:35]


컬럼A 컬럼B
비둘기 10
비둘기 20
비둘기 30
참새 20
참새 30
참새 40

 

안녕하세요, 질문이 있어서 올립니다.

오라클에서 위와 같은 테이블이 있는경우에

컬럼A에서 중복값은 제거하고 컬럼B에서 가장큰값을 가지고 오려면 어떻게 해야하나요 ?

(비둘기 30 , 참새40) 

어떻게 처리해야 할까요?
by 랑에1 [2017.09.26 17:33:24]
WITH t(컬럼A, 컬럼B) AS
(
SELECT '비둘기' , 10 FROM dual
UNION ALL SELECT '비둘기', 20 FROM dual
UNION ALL SELECT '비둘기', 30 FROM dual
UNION ALL SELECT '참새', 20 FROM dual
UNION ALL SELECT '참새', 30 FROM dual
UNION ALL SELECT '참새', 40 FROM dual
)


SELECT listagg(컬럼A || 컬럼B, ', ') within GROUP(ORDER BY 컬럼A) 컬럼
FROM 
(
  SELECT 컬럼A, MAX(컬럼B) 컬럼B
  FROM t
  GROUP BY 컬럼A
)

 


by machinehot [2017.09.26 17:52:37]

listagg 가 오라클 11g 부터 적용이 된다고합니다.. 저는 10g를 사용중이라... 

죄송하지만, 위에 with t 부분도 이해가잘안가지만... 테이블양이 많다면 저렇게 불가능할꺼같은데

다른 방법이 있을까요 ?


by 우리집아찌 [2017.09.26 18:04:12]

LISTAGG

http://www.gurubee.net/article/55512


by 랑에1 [2017.09.26 18:04:31]

SELECT wm_concat(컬럼A || 컬럼B) 컬럼
FROM 
(
  SELECT 컬럼A, MAX(컬럼B) 컬럼B
  FROM t
  GROUP BY 컬럼A
)


with t 부분은 임시 테이블이니 신경쓰지 마시고 실제 사용하시는 테이블을 t에다 넣으세요

 


by machinehot [2017.09.26 17:34:12]
SELECT *
FROM
(
SELECT 컬럼A, 컬럼B, MAX(컬럼B) OVER(PARTITION BY 컬럼A) AS MAX_컬럼B FROM 테이블
)
WHERE 컬럼B = max_컬럼B

 

 

이렇게 하면 될까요 ? ?


by 마농 [2017.09.27 08:50:42]

1. With 문은 테스트용으로 샘플 만든거 정도라고 생각하시면 됩니다.
  - 다 적어가면서 union 하라는 의미가 아닙니다.
  - with 문 무시하시고 select 를 어떤 식으로 작성했는지를 보시면 됩니다.
2. Listagg 는
  - group by 에서 문자열 합칠 때 사용합니다.
  - 질문이 모호한데 이걸 원하시는게 아닌 듯 합니다.
  - 단순 group by 를 원하시는게 아닐런지?
  - "중복값 제거후 큰값" 이란 표현보다는 "a 별 b의 최대값" 이란 표현이 좋을 듯.
  - group by 는 중복제거용이 아니라 집계용입니다. 중복제거는 distinct
3. over 는 분석함수 구문입니다.
  - 집계함수와 분석함수는 집계를 한다는 점에서 유사합니다만
  - 결과를 표현하는 방법에서 큰 차이가 있습니다.
  - 분석함수를 사용할 때와 집계함수를 사용할 때를 구별해야 합니다.

SELECT 컬럼a
     , MAX(컬럼b) 컬럼b
  FROM t
 GROUP BY 컬럼a
 ORDER BY 컬럼a
;

 

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