KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.
이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.
Hackers Table :
Submissions Table :
문제
SQL 학습을 위한 15일 간의 콘테스트 진행, 2016년 3월 1일 ~ 2016년 3월 15일의 기간 중
각 날짜마다 최소 한 번의 제출을 한 고유 해커 수를 계산하고, 각 날짜마다 가장 많은 제출을 한 해커의 ID와 이름을 조회하는 쿼리 작성하기.
여러 해커가 동일한 최대 제출 수를 가진다면, ID가 가장 낮은 해커 순으로 정렬
이 사이트.. MySQL 8.0 미만 버전 이슈로,
WINDOW 함수도 사용이 안되고,
WITH 구문 사용도 안되는 것이 너무.. 킹받는다ㅋㅋ
✔️ 제출 쿼리
✔️ 쿼리 분석
SELECT
s1.submission_date,
# 각 날짜에 최소 하나의 제출을 한 고유 해커 수 계산
(SELECT COUNT(DISTINCT s2.hacker_id)
FROM submissions s2
WHERE s2.submission_date = s1.submission_date
AND (SELECT COUNT(DISTINCT s3.submission_date)
FROM submissions s3
WHERE s3.hacker_id = s2.hacker_id
AND s3.submission_date < s1.submission_date
) = DATEDIFF(s1.submission_date, '2016-03-01')
) cnt,
# 각 날짜에 가장 많은 제출을 한 해커의 ID 찾기
(SELECT s2.hacker_id
FROM submissions s2
WHERE s2.submission_date = s1.submission_date
GROUP BY s2.hacker_id
ORDER BY COUNT(s2.submission_id) DESC, s2.hacker_id
LIMIT 1
) top_id,
# 가장 많은 제출을 한 해커의 이름 찾기
(SELECT h.name
FROM hackers h
WHERE h.hacker_id = (SELECT s2.hacker_id
FROM submissions s2
WHERE s2.submission_date = s1.submission_date
GROUP BY s2.hacker_id
ORDER BY COUNT(s2.submission_id) DESC, s2.hacker_id
LIMIT 1)
) top_name
FROM (SELECT DISTINCT submission_date
FROM submissions) s1
ORDER BY s1.submission_date;
1. 서브 쿼리
# 각 날짜에 최소 하나의 제출을 한 고유 해커 수 계산
(SELECT COUNT(DISTINCT s2.hacker_id)
FROM submissions s2
WHERE s2.submission_date = s1.submission_date
AND (SELECT COUNT(DISTINCT s3.submission_date)
FROM submissions s3
WHERE s3.hacker_id = s2.hacker_id
AND s3.submission_date < s1.submission_date
) = DATEDIFF(s1.submission_date, '2016-03-01')
) cnt,
# 각 날짜에 가장 많은 제출을 한 해커의 ID 찾기
(SELECT s2.hacker_id
FROM submissions s2
WHERE s2.submission_date = s1.submission_date
GROUP BY s2.hacker_id
ORDER BY COUNT(s2.submission_id) DESC, s2.hacker_id
LIMIT 1
) top_id,
# 가장 많은 제출을 한 해커의 이름 찾기
(SELECT h.name
FROM hackers h
WHERE h.hacker_id = (SELECT s2.hacker_id
FROM submissions s2
WHERE s2.submission_date = s1.submission_date
GROUP BY s2.hacker_id
ORDER BY COUNT(s2.submission_id) DESC, s2.hacker_id
LIMIT 1)
) top_name
2. 데이터 그룹화 및 정렬
FROM (SELECT DISTINCT submission_date
FROM submissions) s1
ORDER BY s1.submission_date;