위와 같은 데이터가 있는 QUIZE 테이블이 있다고 가정해 보자.
어 떤 특정 사원은 이력이 중간에 끊어진 경우가 있는데 이러한 끊어진 시작일과 종료일을 추출하고자 한다.
DROP DATABASE IF EXISTS PRACTICE;
CREATE DATABASE PRACTICE;
USE PRACTICE;
CREATE TABLE QUIZE(
MEMBER_NAME VARCHAR(10),
START_DT VARCHAR(20),
END_DT VARCHAR(20)
);
INSERT INTO QUIZE VALUES('홍길동', '19961001', '19981230');
INSERT INTO QUIZE VALUES('홍길동', '19981230', '19990605');
INSERT INTO QUIZE VALUES('홍길동', '19990605', '19991002');
INSERT INTO QUIZE VALUES('홍길동', '20000201', '20000301');
INSERT INTO QUIZE VALUES('홍길동', '20000501', '20001231');
INSERT INTO QUIZE VALUES('김동훈', '19910106', '19910731');
INSERT INTO QUIZE VALUES('김동훈', '19910731', '19940201');
INSERT INTO QUIZE VALUES('김동훈', '19940201', '19921021');
INSERT INTO QUIZE VALUES('김동훈', '19990501', '20000331');
우선 자신의 테이블 내에서 비교를 해야 한다. -> INNER JOIN 활용!
정렬되어있다는 가정 하에 현재 레코드와 바로 다음 레코드를 비교해야 한다. -> 전역 변수 선언 후 번호 매기기 & ON을 통해 조건 걸기!
그 중에서 현재 레코드의 종료일과 다음 레코드의 시작일이 다를 때만 SELECT해주어야 한다. -> WHERE로 SELECT 조건 걸어주기!
이게 전부다.
이를 MYSQL 쿼리문으로 작성하면 다음과 같다.
SET @NUM := 0;
SET @NUM2 := 0;
SELECT
A.MEMBER_NAME AS '이름',
A.END_DT AS '시작일',
B.START_DT AS '종료일'
FROM (SELECT *, @NUM := @NUM + 1 AS NUM FROM QUIZE ORDER BY MEMBER_NAME, START_DT) AS A
INNER JOIN (SELECT *, @NUM2 := @NUM2 + 1 AS NUM FROM QUIZE ORDER BY MEMBER_NAME, START_DT) AS B
ON A.MEMBER_NAME = B.MEMBER_NAME AND A.NUM + 1 = B.NUM AND A.NUM < @NUM
WHERE A.END_DT != B.START_DT;
쿼리문의 결과는 다음과 같다.
아직 공부한 지 얼마 안 되어서 초보니까 미흡한 점이 있을 수 있으니 양해 부탁한다.
조언해주면 고맙겠다.
매우 간단한 문제였다.