✅ 목표: 특정 값이 이전 행, 다음 행 모두 같은 경우만 출력하기
- 데이터를 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 |