데이터 분석

[TIL 15] SQL 추출 시 쿼리 로직과 조건에 대한 중요성

쭈경잉 2025. 6. 16. 23:15

SQL 강의를 들으면서 실제 현업에서 분석에 필요한 데이터 추출을 진행하면서

쿼리 로직과 조건에 대해서 고민하는 시간이 중요하다는 것을 깨달았다.

 

특히나 내가 원하는 예측된 결과 값을 얻기 위해서 "어떤 조건"과 "로직" 단계로

"분석 기준 대상"으로 어떤 "기간"동안 "비교 대상"과 어떻게 다른 지를 보는 게 필요하다. 

 

📝 내가 했던 로직 실수 - 월별 합계 후 구하기 

CASE 1. 이전 구매 이력 기반 교차 구매한 사람 수 구하기 

예를 들어 이전 구매 회차에서 월별로 교차 구매한 사람 수를 알고 싶은 데 

구매 날짜가 기준이 아닌 구매회차를 기준으로 하다 보니 회차 내에 동시 구매한 사람은 교차 구매로 찍히지 않는 문제가 생겼다.

 

CASE 2. 이전 구매 이력 기반 재구매자 수 구하기 

구매 날짜 기준으로 이전에 구매한 이력이 있으면 재구매로 해야 하는 데
아래의 2가지 방식은 다른 결과를 갖게 된다. 

 

월별 합계 ➡️ 구매한 이력 찾아 재구매자수 구하기 : 월 단위로 재구매자 수가 쪼개 지기 때문에 동일 월에서 재구매한 사람 수는 카운팅 X 

구매한 이력 찾아 재구매자 수 일별 찾기 ➡️ 월별 합계

 

결정적으로 월별 합계를 먼저 해버리게 되면 고객 id 한 행씩 이전 구매 이력을 잃어버리게 된다.

그러면서 이전 구매 이력을 기반으로 해서 다른 카테고리 제품의 구매 등 날짜 기반의 구매 이력을 고려한 로직 설계가 어려워지게 된다.

 

이렇듯 초반에 "어떤 것을 보기 위해" - 목적 / 어떤 지표와 데이터를 볼 것인 지 구체화하는 게 중요하다.

그래서 분석을 할 때에는 분석 기준, 비교 대상, 목적, 지표 및 데이터 구체화 과정이 필요함을 더더욱 느꼈다.


WHERE 조건과 JOIN 조건에 따른 결과 차이

→ 데이터 추출은 로직 설계 싸움이라는 말이 나올 정도로 중요한 부분이다. 

🎯 해결 전략: "논리 설계 → 쿼리 구현"의 순서 지키기

1. 내가 분석하고 싶은 것은 무엇인가? → 정량화
2. 어떤 테이블에서 → 어떤 조건의 데이터를 → 어떻게 묶어야 하는가?
3. 조인 시에는 누가 기준이 되는가?
4. WHERE 조건은 전체 데이터에서 필터링? 조인 결과에서 필터링?

 

예시: "고객이 재구매한 SKU 중 신규 사이즈 비중"

  • member_id, SKU, order_date, size 가 필요
  • → 신규 사이즈와 기존 사이즈를 비교
  • → JOIN or WINDOW 함수 필요
  • → 데이터 체크 : WHERE을 잘못 걸면 “첫구매만 남거나” 혹은 “모든 주문 다 포함”돼서 비율이 틀어질 수 있음

데이터 결과 검증 방법

“결과가 내가 원한 분석 결과가 맞는지 모르겠을 때”를 줄이는 법

✔ 검증 전략 3단계

단계 질문 체크  방법
1 로우 수가 말이 되나? 전체 유저 수, 전체 주문 수 등으로 sanity check
2 중복된 고객이 포함됐나? DISTINCT member_id로 비교
3 첫구매 vs 재구매 조건이 정확히 적용됐나? CASE WHEN, ROW_NUMBER()로 확인 쿼리 따로 돌려보기

✔️ 팁: 쿼리를 짤 때마다 아래 질문을 던지며 점검하기 

1. 이 데이터는 집계 전(raw)인가, 집계 후인가?
2. WHERE은 분석을 위한 "필터링"인가, 데이터 정제를 위한 "제한 조건"인가?
3. 내가 지금 보고 있는 컬럼 단위는 개별 주문인가, 고객 단위인가?

✍️ 추천 학습법: 실무 기반 SQL 설계 노트 쓰기

  1. 분석 목적 → 문장으로 작성
  2. 어떤 조건, 어떤 집계 → 구체화
  3. 쿼리 쓰기 전 "예상 결과 예시" 3~4줄 가상으로 작성 → 예상 테이블 그려보기 
  4. 실제 쿼리 작성 후 비교 → 틀리면 다시 2번 진행 

그래서 요즘 쿼리를 짜면서 꼭 하는 단계는 "로직 점검"이었다. 

단계별로 어떤 것들을 기반으로 로직 짜는 법에 대해 챗 GPT에게 점검을 받는 과정을 거친다.

 

그러면서도 내가 앞으로 시도해보고자 하는 부분은 아래와 같다.

✅ 쿼리 로직 단계별로 확인해보기

✅ 쿼리 로직에 따라 샘플 데이터 기반으로 예측해 데이터 정합성 체크하기

→ 카페 24 or 빅쿼리 id 값 기반 1개 예시를 통해 결과 값 = 쿼리로 짠 값을 비교해 로직이 맞는 지 체크하는 방법 

 

무엇보다 데이터의 "정합성"과 신뢰도를 높이는 작업이 중요하기에

로직 체크 뿐만 아니라 로직 설계를 하며 이러한 정합성 체크는 필수라고 생각한다.


✅ "데이터 추출 결과 예측"의 중요성

📌 이유: 결과를 예측하지 않으면, 로직이 맞는지도 검증 못함 

  • 쿼리 결과가 “의도한 것”인지 확인하려면, 미리 어떤 형태의 데이터가 나와야 정상인지 알고 있어야 한다.
  • 특히 집계(Aggregation) 결과나 중복 제거 여부는 사전에 예상한 row 수/값과 비교가 필수로 진행해야 한다. 

✔ 예시

“사이즈별 첫 구매자 수”를 구하고 싶다
→ 고객 수가 전체 구매자보다 많을 리 없음
→ member_id, size, MIN(order_date) 단위로 예상 row 수를 계산하고 쿼리 실행 결과와 비교해야 함
→ 이때, 샘플링 값으로 실제 값과 예측 값을 대조해보는 것도 방법!

 

✅ 로직이란? “데이터를 어떻게 가공해서, 내가 원하는 기준으로 정리할 것인가”

📌 핵심: 분석 목적을 데이터 연산 흐름으로 바꾸는 과정

  • 분해 → 정렬 → 조건 판단 → 집계의 흐름을 따라가야 함
  • 쿼리 블록을 나누고 CTE (WITH)로 로직을 명확히 구분하는 것도 중요

✔ 예시

“첫 구매는 블랙 컬러였고, 재구매는 핑크 컬러인 고객”
→ 고객별 첫 구매 컬러 LAG() 또는 MIN()
→ 재구매 시점 컬러 비교
→ CASE WHEN으로 필터링

 

✅ WHERE 조건은 분석 결과를 완전히 바꾸는 핵심 트리거

📌 핵심: WHERE는 “데이터를 자르기” 위한 도구

  • JOIN 전에 거르면 전체에서 제외됨
  • JOIN 후에 거르면 조인된 결과에서 제외됨
  • 집계 전에 거르면, 집계 대상이 줄어듦
  • 집계 후에 거르면, 계산된 결과에서 필터됨

✔ 실무에서 많이 하는 실수

  • 분석에 필요한 데이터를 WHERE에서 미리 잘라버려서
    → 집계 결과가 부정확하거나
    → 의도한 고객군이 빠져버림
    내가 했던 실수! 초반 base가 되는 테이블에서 잘라버리면 원하는 값 추출이 어려워짐! 

✅ TIP - 추출할 때 고려해야 할 것 

1. 내가 보고 싶은 결과는 무엇인가? (숫자? 비율? 리스트?)
2. 이걸 계산하기 위해 어떤 중간 단계가 필요한가?
3. 중간 단계의 데이터는 어떤 형태여야 정상인가?
4. 그걸 위한 조건은 언제, 어디서 걸어야 가장 정확한가?
5. 최종 결과가 내가 예상한 수치와 맞는가?

추출할 때 쿼리 작성 시, 기준/분석 대상 등 주석을 꼼꼼하게 달아주는 것도 잊지 않기 -! 

 

✏️ 추출을 하면서 느꼈던 점 요약 
✅ 쿼리 로직의 중요성, 데이터 정합성 확인을 위한 "결과 예측"의 중요성 잊지 말기 
✅ 쿼리 단계별로 중간 단계 데이터에 대한 형태 고민과 예측 / 실제 결과 확인하는 과정도 중간에 챙겨보자