[고전] MYSQL 문제 풀기

진이·2023년 4월 2일
0

mysql

목록 보기
2/5

문제

위와 같은 데이터가 있는 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;

쿼리문의 결과는 다음과 같다.

아직 공부한 지 얼마 안 되어서 초보니까 미흡한 점이 있을 수 있으니 양해 부탁한다.
조언해주면 고맙겠다.
매우 간단한 문제였다.

profile
최선을 다할게

0개의 댓글