SQL 코드카타 180번
미친 개어려운 문제.
날짜별로 연속해서 제출한 해커의 숫자와 (리텐션을 구하는 흐름과 상당히 유사하다. 당연히 첫날이 가장 많고, 갈수록 줄어드는 퍼널 형태의 숫자가 나올 것이다), 해당일에 가장 많은 결과를 제출한 해커의 id (연속 제출 여부와는 관계없음), 그리고 이름을 출력해야 한다. 뒷부분은 크게 어렵지 않은데 연속해서 제출한 해커의 숫자를 구하는 쿼리를 짜는 게 어려운 부분.
GPT와 구글링을 병행하면서 어찌저찌 답은 나왔는데,
한 단계씩 뜯어서 기록으로 남기기에는 오늘은 기력이 없어서 내일 다시 풀어봐야겠다. 풀이도 그 때 한꺼번에 올리는 것으로!
SELECT s.submission_date, s_count.hacker_count, s_best.best_hacker, h.name
FROM submissions as s
JOIN (
SELECT submission_date, count(distinct hacker_id) as hacker_count
FROM submissions as s1
WHERE submission_date - DATE('2016-03-01') = (
SELECT count(distinct submission_date)
FROM submissions as s2
WHERE s2.submission_date < s1.submission_date
and s2.hacker_id = s1.hacker_id
)
GROUP BY submission_date
) as s_count on s.submission_date = s_count.submission_date
JOIN (
SELECT submission_date, hacker_id as best_hacker
FROM submissions as s3
WHERE hacker_id = (
SELECT hacker_id
FROM submissions as s4
WHERE s4.submission_date = s3.submission_date
GROUP BY hacker_id
ORDER BY count(submission_id) desc, hacker_id limit 1
)
GROUP BY submission_date, hacker_id
) as s_best on s.submission_date = s_best.submission_date
JOIN hackers as h on s_best.best_hacker = h.hacker_id
GROUP BY s.submission_date, s_count.hacker_count, s_best.best_hacker, h.name
ORDER BY s.submission_date;
풀면서 여러 가지 생각들이 들었는데,
일단 오늘은 더 이상 생각하지 말기로 하자ㅎㅎ