하나의 표 안에서 행 비교하기
쌍, 중복, 인접한 레코드를 찾는 SELF JOIN 패턴을 알아봅니다.
하나의 표 안에서 행 비교하기은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
행 간 비교를 위한 SELF JOIN
계층 구조 외에 SELF JOIN의 또 다른 주요 용도는 같은 테이블의 행을 서로 비교하는 것입니다. 부모와 자식의 관계를 만드는 대신 임의의 행을 조합하여 중복, 유사한 일치 항목 또는 인접한 레코드를 찾습니다.
패턴은 동일합니다. 테이블에 두 개의 별칭을 지정하고, 조합하려는 두 행 사이의 관계를 표현하는 ON 조건을 작성합니다.
같은 그룹에서 쌍 찾기
전형적인 질문은 같은 부서에서 근무하는 모든 직원 쌍을 찾는 것입니다. 부서가 같은지를 기준으로 테이블을 자기 자신과 조인하되, 두 행은 서로 다르게 유지해야 합니다.
단순하게 조인하면 모든 직원이 자기 자신과도 조합되고 각 쌍이 두 번씩 생성됩니다. 다음에서 이를 해결합니다.
SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b ON a.department = b.department;자기 자신과의 조합 및 대칭 중복 제거
같은 그룹의 쌍을 만들 때는 두 가지 문제가 발생합니다. 한 행이 자기 자신과 일치하고(Alice와 Alice), 각 쌍이 두 번 나타납니다(Alice-Bob과 Bob-Alice).
단 하나의 부등식으로 두 문제를 모두 해결할 수 있습니다. a.id < b.id를 사용하면 두 행이 서로 다르다는 것이 보장되고 각 쌍의 순서도 하나만 유지됩니다.
SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b
ON a.department = b.department
AND a.id < b.id;a.id < b.id를 사용하는 이유와 a.id <> b.id를 사용하지 않는 이유
a.id <> b.id를 사용하면 자기 자신과의 조합은 제거되지만 두 순서가 모두 반환되어 결과가 두 배가 됩니다. a.id < b.id를 사용하면 자기 자신과의 조합을 제거하면서 대칭적인 중복도 한 번에 제거할 수 있습니다.
면접관은 특히 <와 <> 중 어떤 것을 선택하는지 확인합니다. 이는 SELF JOIN의 조합 원리를 이해하고 있는지를 보여 줍니다.
-- <> keeps Alice-Bob AND Bob-Alice (duplicated)
-- < keeps only Alice-Bob (correct unique pairs)중복 행 찾기
주요 열의 값이 서로 중복되는 레코드를 찾으려면 해당 열을 기준으로 SELF JOIN하고 기본 키가 서로 다르도록 조건을 지정하십시오.
여기서는 같은 이메일 주소를 공유하는 고객을 찾아냅니다. a.id < b.id 조건을 사용하면 각 중복 쌍이 한 번만 나타납니다. 대개는 GROUP BY ... HAVING COUNT(*) > 1이 더 간결하지만, SELF JOIN을 사용하면 문제가 되는 실제 쌍을 나란히 표시할 수 있습니다.
SELECT a.id, b.id, a.email
FROM customers a
JOIN customers b
ON a.email = b.email
AND a.id < b.id;인접한 레코드 비교하기
분석가가 자주 수행하는 작업 중 하나는 각 행을 시퀀스의 다음 행과 비교하는 것입니다. 예를 들어 각 날짜의 매출을 전날의 매출과 비교할 수 있습니다. SELF JOIN을 사용하면 연속된 행을 조합할 수 있습니다.
여기서는 각 날짜를 정확히 하루 전의 행과 조인하여 변화량을 계산합니다. 시퀀스에 빈 날짜가 없을 때 작동하는 방법입니다.
SELECT t.day, t.amount,
t.amount - y.amount AS change_vs_prev
FROM daily_sales t
JOIN daily_sales y
ON y.day = t.day - INTERVAL '1 day';인접 행 SELF JOIN의 공백 문제
날짜가 하나라도 누락되면 이전 쿼리는 작동하지 않습니다. 정확히 하루 전의 행이 없으므로 해당 행이 제외되거나(INNER JOIN), NULL 값을 직접 처리해야 합니다.
그래서 면접관은 '이전 행과 비교하기'와 같은 작업에 윈도 함수의 LAG를 사용하도록 유도하는 경우가 많습니다. 윈도 함수는 값의 일치가 아니라 순번을 사용하므로 공백도 자연스럽게 처리합니다.
-- LAG handles gaps; the self join assumed contiguous days
SELECT day, amount,
amount - LAG(amount) OVER (ORDER BY day) AS change_vs_prev
FROM daily_sales;자기 조인과 윈도 함수
장단점을 이해하십시오:
- 자기 조인은 값 관계(같은 부서, 이전 날짜)를 기준으로 행을 비교합니다. 유연하지만 행이 증폭될 수 있고 간격을 제대로 처리하지 못할 수 있습니다.
- 윈도 함수는 정렬된 분할 그룹 안의 순서상 위치를 기준으로 비교합니다. 이전/다음 행을 다루는 데 더 깔끔합니다.
'인접한 행과 비교'하려면 LAG/LEAD를 우선 사용하십시오. '조건에 맞는 모든 쌍 찾기'에는 자기 조인이 자연스러운 도구입니다.
동료보다 높은 값을 가진 행 찾기
또 다른 패턴은 부서의 동료 중 한 명 이상보다 급여가 높은 직원을 찾는 것입니다. 자기 조인으로 이를 직접 표현할 수 있습니다.
각 직원을 같은 부서에 속하면서 급여가 더 낮은 다른 직원들과 조인한 다음, 결과에 나타나는 중복 없는 직원만 남깁니다. 영어 문장을 거의 그대로 읽는 듯한 형태입니다.
SELECT DISTINCT a.name, a.department, a.salary
FROM employees a
JOIN employees b
ON a.department = b.department
AND a.salary > b.salary;행 증폭 주의
고유하지 않은 열을 기준으로 자기 조인을 수행하면 행 수가 늘어납니다. 100명이 있는 부서 안에서 짝을 만들면 조건을 적용하기 전에 약 100 x 100개의 후보 쌍이 생깁니다.
항상 중복 제거 조건식(a.id < b.id)을 포함하고, 모든 쌍이 아니라 참여하는 행만 필요하다면 DISTINCT 또는 그룹화를 추가하십시오. 면접에서는 이러한 행 증폭에 대한 인식을 언급하십시오.
비교 도구 선택하기
테이블 내부 비교를 위한 판단 안내:
- 일치하는 모든 쌍(중복, 동일 그룹 조합):
a.id < b.id를 사용하는 자기 조인 - 정렬 순서에서의 이전/다음 행: 윈도 함수(
LAG/LEAD) - 각 행을 그룹 집계값과 비교: 상관 하위 쿼리 또는 윈도 집계
빠른 확인
같은 카테고리를 공유하는 모든 고유 제품 쌍을 구하려고 합니다. 어떤 제품도 자기 자신과 짝을 이루지 않아야 하며, 순서만 다른 중복 쌍도 없어야 합니다.
복습: 하나의 테이블 안에서 행 비교하기
핵심 요점:
- 중복 찾기와 동일 그룹 조합을 위해 테이블을 자기 조인하여 테이블 자체의 행을 쌍으로 묶습니다.
a.id < b.id를 사용하면 하나의 조건식으로 자기 자신과의 쌍과 대칭적인 중복 쌍을 제거할 수 있습니다.- 자기 조인을 사용한 인접 행 비교는 간격이 있으면 깨지므로, 이전/다음 행을 다룰 때는
LAG/LEAD를 우선 사용하십시오. - 고유하지 않은 열을 조인할 때는 항상 행 증폭을 고려하십시오.
자주 묻는 질문
“하나의 표 안에서 행 비교하기” 강의는 무료인가요?
네 — “하나의 표 안에서 행 비교하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“하나의 표 안에서 행 비교하기”에서 뭘 배우나요?
쌍, 중복, 인접한 레코드를 찾는 SELF JOIN 패턴을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“하나의 표 안에서 행 비교하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- CROSS JOIN과 카테시안 곱
- SELF JOIN으로 계층 구조 다루기
- 하나의 표 안에서 행 비교하기
- 적절한 JOIN 유형 선택하기