특정컬럼 중복값 제거 0 19 6,811

by alice [Oracle 기초] [2019.11.28 10:56:44]


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

 

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

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

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

(비둘기 30 , 참새40) 

?

1

어떻게 처리해야 할까요?

by 정충보국 [2019.11.28 11:06:33]

WITH T AS (
SELECT '비둘기' A, '10' B FROM DUAL 
UNION ALL
SELECT '비둘기' A, '20' B FROM DUAL 
UNION ALL
SELECT '비둘기' A, '30' B FROM DUAL 
UNION ALL
SELECT '참새' A, '20' B FROM DUAL 
UNION ALL
SELECT '참새' A, '30' B FROM DUAL 
UNION ALL
SELECT '참새' A, '40' B FROM DUAL 
)
SELECT a, max(b) FROM T
group by a
order by a
;


by alice [2019.11.28 13:35:09]

2개의 테이블일 경우 어떻게 하면 될까요?


by 우리집아찌 [2019.11.28 11:16:42]

-- row_number() over() 함수

select *
  from ( select a , b ,row_number() over( partition by a order by b desc ) rn

                 from t )

where rn = 1


by alice [2019.11.28 13:35:04]

2개의 테이블일 경우 어떻게 하면 될까요?


by 마농 [2019.11.28 14:16:45]

질문을 구체적으로 해주세요.


by alice [2019.11.28 15:21:57]

1,2,3,4 값을 뽑을게 잇는데
1,2 는 a테이블
3,4 는 b테이블
1에 값의 중복을 제거 해야한다.
4의 순서대로 정렬을 해아한다.


by 마농 [2019.11.28 15:29:36]

표현이 모호하여 질문을 이해하기 어렵습니다.
원본 대비 결과표 자료 예시를 가지고 질문해 주세요.
포괄적으로 답변 드리면
두 테이블을 연결하여 조회하려면 조인을 해야 합니다.
여러 건의 자료를 하나로 집계하려면 집계 쿼리를 써야 합니다.


by alice [2019.11.28 16:42:06]

테이블A

이름 소속 수량
사과 과일 2
사과 과일 5
시금치 야채 3

 

  테이블B

이름

팔린시간
사과 오후2시
시금치 오전2시

 

아래와 같이 뽑아내고 싶습니다.

이름 소속 수량 팔린시간
시금치 채소 3 오전2시
사과 과일 5 오후2시

 


by alice [2019.11.28 16:43:20]

 

join을 걸고 팔린시간으로 정렬하며, 이름의 중복을 없애고 싶습니다...


by 마농 [2019.11.28 17:43:58]
WITH t_a AS
(
SELECT '사과' 이름, '과일' 소속, 2 수량 FROM dual
UNION ALL SELECT '사과',   '과일', 5 FROM dual
UNION ALL SELECT '시금치', '야채', 3 FROM dual
)
, t_b AS
(
SELECT '사과' 이름, '오후2시' 팔린시간 FROM dual
UNION ALL SELECT '시금치', '오전2시' FROM dual
)
SELECT a.이름
     , a.소속
     , MAX(a.수량) 수량
     , b.팔린시간
  FROM t_a a
     , t_b b
 WHERE a.이름 = b.이름
 GROUP BY a.이름, a.소속, b.팔린시간
 ORDER BY b.팔린시간
;

 


by alice [2019.11.29 12:30:31]

혹시 다른 방법은 없을까요?


by 마농 [2019.11.29 13:07:30]

다른 방법을 찾는 이유가 뭘까요?


by alice [2019.11.29 14:07:17]

데이터가 너무 많아 저렇게 하기엔 너무 번거로운 것 같습니다.
또한 한가지 방법으로 하기보단 여러가지 방법이 궁금합니다.


by 마농 [2019.11.29 14:20:08]

WITH 문 때문에 번거롭다고 생각하시는 건가요?
WITH 문 없다고 생각하시고 아래 쿼리만 보세요.


by alice [2019.11.29 15:10:56]

아하 이해 했습니다. 선생님

그러나 이름의 중복이 제거되지 않았습니다.ㅠ


by alice [2019.11.29 14:28:36]

(

SELECT '사과' 이름, '과일' 소속, 2 수량 FROM dual

UNION ALL SELECT '사과',   '과일', 5 FROM dual

UNION ALL SELECT '시금치', '야채', 3 FROM dual

)

, t_b AS

(

SELECT '사과' 이름, '오후2시' 팔린시간 FROM dual

UNION ALL SELECT '시금치', '오전2시' FROM dual

)

이부분에서 데이터를 직접 기입을 하는데, 데이터가 만건이 넘을 경우 다 입력하기엔 번거롭지않을까요??....

아닌가... 방법을 잘 모르겟습니다.ㅠ


by 마농 [2019.11.29 14:32:33]

데이터를 일일히 적으란 뜻이 아닙니다.
WITH 문은 테이블이 없어 테이블 대신 적은 것입니다.
WITH 문은 제가 테스트용으로 적은 것일 뿐입니다.


by 마농 [2019.11.29 16:02:48]

질문의 예시를 가지고 테스트 해서 결과 잘 나옵니다.
실제 원하는 결과가 안나온다면? 안나오는 예시자료를 들어주세요.
이름이 중복제거가 안된다면? 소속이 다른 자료나 팔린시간이 다른 자료가 있다는 거죠.
이런 예를 가지고 어떤 결과가 나와야 할지? 원본 대비 결과표 예를 들어 주세요.


by alice [2019.11.29 17:15:49]

선생님  row_number() over(partition by ~를 이용하여 rank를 매긴 것들을 1로 뽑아 해결 하였습니다.  

설명을 제대로 못해 죄송합니다.ㅠ

감사합니다!!

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