240611_TIL

J Lee·2024년 6월 11일
0

아무리 사소하더라도 배움이 없는 날은 없다.

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;

풀면서 여러 가지 생각들이 들었는데,
일단 오늘은 더 이상 생각하지 말기로 하자ㅎㅎ

profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보