목차
- SQL 에서 중복값 찾는 방법
= 조건문 차이 where <-> having
- SolveSQL 우리 플랫폼에 정착한 판매자 1
= 오류 분석
= 틀린코드와 정답 코드
= 오류 더 분석
중복된 데이터를 다루는 것은 SQL의 문제를 풀다보면, 정말 자주 접할 수 있다.
이번 글은 SQL의 Group By 와 Having 절을 활용해 중복값을 발견하고 이를 제거할 수 있는 방법에 대해서 알아보려고 한다.
데이터베이스 내 데이터가 잘 구축되기 위해, 데이터가 추출 및 합쳐질 정보의 중복 생성을 막고자 기본키(primary key)와 같은 고유 제약 조건을 가지는 것이 좋다. 그러나 막상 실제로 작업을 하다보면 이상적으로 돌아가지 않을 때가 ㅏ많다.
중복값은 올바른 계산을 위해 필요하다.
SQL 에서 중복값을 찾는 방법
몇 개의 열 내에서 중복값의 유무를 확인할지에 대해서 생각해봐야 한다.
1개의 열 내에서만 중복값을 확인하는 것
여러 열 안에서의 중복값을 찾는 방법이 있다.
1. GROUP BY 절 사용 : 중복값이 존재하는지 확인하고 싶은 열을 기준으로 GROUP BY를 실행해 열을 합친다.
2. HAVING 절 안에 COUNT 함수 사용 : GROUP BY 를 통해 그룹핑된 값의 개수에 따라 조건을 설정할 수 있음
(그룹 별 집계된 결과 중 원하는 조건을 필터링 하는 방법은 where 이 아닌 having 절을 사용해야 한다.
둘의 차이점은 having 절은 group by 절과 함께 사용하여 집계 함수(COUNT, SUM, AVG, MAX, MIN)과 함께 조건절(AND, OR)을 작성하거나 group by 컬럼만 조건절에 사용할 수 있다.)
SolveSQL 에서 우리 플랫폼에 정착한 판매자 1, 난이도는 쉬움이다.
문제를 분석해봤을때, 단순히 group by를 잘 써주면 된다고 생각을 했다.
그런데 생각보다 정답률이 낮다. 이유가 뭔지 너무 궁금해서 분석해봤다.
그 이유는 distinct, order_id 값에 집계함수 count 사용 시 중복처리를 해주어야 하는 것을 빼먹는것 같다.
그말은 즉슨, 한명의 판매자가 동일한 주문 id 가 두개 이상 있는게 있다는 것이다. 근데 총 주문이 100건 이상 들어온 판매자의 리스트를 출력하는건데, 중복된 주문 id 는 “총 주문”에 치지 않는 것인지에 대해서 의문이 들었다.
중복된 주문 id는 데이터의 오류였던 건지, 아니면 주문을 여러번 할 수 있는 거였는지가 헷갈렸던 것 같다.
(아래에 중복된 order_id에 대한 분석이 이어진다.)
아래는 틀린 코드로, 중복값을 안지워줬을때
더 많은 크기의 값이 출력되어서 틀렸다고 했다.
Select
seller_id,
count(order_id) as orders
FROM
olist_order_items_dataset
GROUP BY
seller_id
HAVING COUNT(order_id) >= 100
아래는 정답 코드
Select
seller_id,
count(DISTINCT order_id) as orders
FROM
olist_order_items_dataset
GROUP BY
seller_id
HAVING count(DISTINCT order_id) >= 100
의문 해결
그러나 이런거에 단순히 넘어가면 내가 아니다.
제대로 order_id 가 무엇인지 분석해보고자 한다.
Order_id 라는 컬럼이 중복되는 경우가 무엇인지 찾아보자.
1.그러면 먼저, order_id 가 중복 데이터만 찾아서 출력하는 쿼리를 작성해줬다.
-- select *,
-- count(order_id) from olist_order_items_dataset
-- GROUP by order_id
-- HAVING count(*) > 1 limit 60
2. 특정 order_id 를 선택해서 그 값들을 본다.
SELECT 컬럼명 FROM 테이블명 GROUP BY 컬럼명 having count(컬럼명) > 1
SELECT * from olist_order_items_dataset
where order_id == '0008288aa423d2a3f00fcb17cd7d8719'
확인해본 결과, product_id, seller_id, shipping_limit_date, price, freight_value 컬럼이 동일하고, 다른 것은 오로지 order_item_id 였다.
그러면 이 값은 더블 클릭을 했거나, 한 이슈로 잘못되게 값이 두번 들어간 것인 것 같다.
참고한 사이트
- 중복값 찾기 (https://blog.naver.com/gmlcjf272/70180584681)
'공부' 카테고리의 다른 글
[Learning Spark] Chapter 2 : 아파치 스파크 다운로드 및 시작 (0) | 2024.08.22 |
---|---|
[SolveSQL] ORDER BY ASC, DESC (오름차순, 내림차순 정렬) 최고의 근무일을 찾아라 (0) | 2024.08.08 |
[SolveSQL] 두 테이블 결합하기, SQL 조인(JOIN) 정리 (0) | 2024.07.30 |
[SolveSQL] 다음날도 서울숲의 미세먼지 농도는 나쁨, with as 문 (0) | 2024.07.28 |
히스토그램(histogram) - 시각화를 어느 상황에서 사용하면 좋을까? (1) | 2024.01.03 |