AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

SQLD/2과목 : SQL 기본 및 활용

2.18 복합 쿼리 예제 3

qordnswnd123 2025. 7. 4. 12:05

✅ 목표: 특정 값이 이전 행, 다음 행 모두 같은 경우만 출력하기

  • 데이터를 A/B 그룹으로 나누고
  • 그룹 내에서 값이 연속으로 반복되는 행만 뽑아내는 쿼리입니다.

 

🔍 예제 테이블(tbl)

 

📄 최종 목표:

  • 같은 그룹(a, b) 안에서
  • evl값이 이전 행과도 같고, 다음 행과도 같으면 출력!

 

✅ 전체 SQL 코드

SELECT *
FROM (
    SELECT
        id,
        svl,
        evl,
        SUBSTR(id, 1, 1) AS gr,  -- 그룹 나누기: id 앞글자 (a, b)
        
        CASE 
            WHEN svl = LAG(evl) OVER (PARTITION BY SUBSTR(id, 1, 1) ORDER BY svl, NVL(evl, 999))
            THEN 1 ELSE 0 
        END AS flag1,
        
        CASE 
            WHEN svl = LEAD(evl) OVER (PARTITION BY SUBSTR(id, 1, 1) ORDER BY svl, NVL(evl, 999))
            THEN 1 ELSE 0 
        END AS flag2

    FROM tbl
) t
WHERE flag1 = 1 AND flag2 = 1;

 

🔍 설명

① SUBSTR(id, 1, 1) AS gr

  • id의 첫 글자 (a or b)로 그룹을 나눕니다.

② LAG(evl), LEAD(evl)

  • 윈도우 함수!
    • LAG: 이전 행의 evl 값을 가져옵니다.
    • LEAD: 다음 행의 evl 값을 가져옵니다.

③ PARTITION BY gr

  • 그룹끼리 따로따로 비교하겠다는 뜻입니다.
    • a 그룹은 a끼리
    • b 그룹은 b끼리 비교해요

④ ORDER BY svl, NVL(evl, 999)

  • 같은 그룹 안에서 정렬 기준입니다.
  • evl이 NULL이면 999로 처리해서 정렬에 혼란이 없게 만듭니다.

⑤ CASE WHEN ... THEN 1 ELSE 0 END

  • 조건 만족하면 1, 아니면 0을 만들어 flag1, flag2 컬럼으로 저장

⑥ 최종 출력 조건: flag1 = 1 AND flag2 = 1

  • 즉, 앞도 같고, 뒤도 같아야 출력됩니다!

 

🧪 실행 결과 예시

 

→ a002의 경우:

  • 이전 행(a001)의 evl = 2
  • 자기 자신의 svl = 1
  • 다음 행(a003)의 evl = 2
    → 모두 조건 만족

 

📌 정리 요약

 

 

🎯 시험 대비 팁

  • 윈도우 함수에서 PARTITION BY를 썼는지 꼭 확인
  • LAG / LEAD는 한 행 차이
  • NVL은 NULL 방지용
  • 복잡해 보여도, 기능 단위로 쪼개서 생각하면 단순합니다!

'SQLD > 2과목 : SQL 기본 및 활용' 카테고리의 다른 글

2.20 트랜잭션  (0) 2025.07.07
2.19 복합 쿼리 예제 4  (0) 2025.07.04
2.17 정규 표현식  (0) 2025.07.04
2.16 피벗(PIVOT) & 언피벗(UNPIVOT)  (0) 2025.07.04
2.15 계층형 질의  (1) 2025.07.04