https://chloe-chitchat.tistory.com/97
[HackerRank] 15 Days of Learning SQL (Hard)
못 풀어서 다른사람 답안 보고 공부했다 FROM절이 거의 쓸모가 없고 네개의 각 컬럼을 다 따로 구하는 접근이 인상깊었다 해커랭크가 그렇게 어려운 플랫폼이 아닌데 이 문제만 갑자기 급발진이
chloe-chitchat.tistory.com
너무 어려워서 위 블로그를 참조했다. 똑같은 쿼리라 쓰기도 민망하다. 내일 이 문제 다시 복습하고, Medium 문제 빠르게 다시 한번 더 풀어봐야겠다.
우선 정답 쿼리부터 보자
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')
),
(
SELECT s2.hacker_id
FROM Submissions s2
WHERE s2.submission_date = s1.submission_date
GROUP BY hacker_id
ORDER BY COUNT(submission_id) DESC, hacker_id
LIMIT 1
)AS what,
(SELECT name FROM hackers WHERE hacker_id = what)
FROM (SELECT DISTINCT submission_date FROM Submissions) AS S1
GROUP BY 1
-
ELECT COUNT(DISTINCT s2.hacker_id) FROM Submissions S2 WHERE S2.submission_date = s1.submission_date AND (내부 서브쿼리)
- 현재 날짜(s1.submission_date)에 제출한 해커들 중에서 내부 서브쿼리의 조건을 만족하는 해커들의 수를 카운트합니다.
- 내부 서브쿼리:
sql
SELECT COUNT(DISTINCT S3.submission_date) FROM submissions s3 WHERE s3.hacker_id = s2.hacker_id AND s3.submission_date < s1.submission_date
- 이 서브쿼리는 특정 해커(s2.hacker_id)가 현재 날짜(s1.submission_date) 이전에 제출한 고유한 날짜 수를 계산합니다.
- 핵심 조건:
sql
(내부 서브쿼리) = DATEDIFF(s1.submission_date, '2016-03-01')
- DATEDIFF 함수는 현재 날짜(s1.submission_date)와 시작일(2016-03-01) 사이의 일수를 계산합니다.
- 예: 3월 5일이라면 DATEDIFF는 4입니다(3월 1일, 2일, 3일, 4일 - 총 4일).
- 내부 서브쿼리 결과가 이 DATEDIFF와 정확히 일치해야 합니다.
<2025년 5월 8일 복습>
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')
),
(
SELECT s2.hacker_id
FROM submissions s2
WHERE s2.submission_date = s1.submission_date
GROUP BY hacker_id
ORDER BY COUNT(submission_id) DESC, hacker_id
LIMIT 1
) AS what,
(
SELECT name FROM hackers WHERE hacker_id = what
)
FROM (SELECT DISTINCT submission_date FROM submissions )s1
GROUP BY 1
중요한건 두번째 컬럼
1. 날짜만 있는 s1과 인적정보가 있는 s2를 s1 날짜 s2 날짜 기준으로 조인한다.
2. s2와 s3를 셀프조인 한다.
3.[중요] s1보다 과거인 s3 역대 제출일 개수 = 첫날부터 s1까지의 일수 차이 조건에 해당하는 해커를 찾으면 매일매일 한 사람 찾기가 가능하다.
4. s1날짜 = s2날짜로 되어있으니, s2의 해커id 수를 센다.
'MYSQL > HakerRank_Hard' 카테고리의 다른 글
Interviews (0) | 2025.04.23 |
---|