15 Days of Learning SQL

  • + 0 comments

    The original version I wrote was very long, but after looking at other answers, I simplified it using the condition in the WHERE clause. Thank you very much!

    SELECT
        daily_continuous.submission_date,
        daily_continuous.continuous_hackers_count,
        daily_max.hacker_id,
        h.name
    FROM (
        SELECT
            s1.submission_date,
            COUNT(DISTINCT s1.hacker_id) AS continuous_hackers_count
        FROM Submissions AS s1
        WHERE (
            SELECT
                COUNT(DISTINCT s2.submission_date)
            FROM Submissions AS s2
            WHERE s2.hacker_id = s1.hacker_id
            AND s2.submission_date < s1.submission_date
        ) = DATEDIFF(s1.submission_date, '2016-03-01')
        GROUP BY s1.submission_date
    ) AS daily_continuous
    
    JOIN (
        SELECT
            daily_max_hackers.submission_date,
            MIN(daily_max_hackers.hacker_id) AS hacker_id
        FROM (
            SELECT
                daily_hacker_data.submission_date,
                daily_hacker_data.hacker_id
            FROM (
                SELECT
                    submission_date,
                    hacker_id,
                    COUNT(*) AS sub_count
                FROM Submissions
                GROUP BY submission_date, hacker_id
            ) AS daily_hacker_data
            JOIN (
                SELECT
                    daily_hacker_data.submission_date,
                    MAX(daily_hacker_data.sub_count) AS sub_max
                FROM (
                    SELECT
                        submission_date,
                        hacker_id,
                        COUNT(*) AS sub_count
                    FROM Submissions
                    GROUP BY submission_date, hacker_id
                ) AS daily_hacker_data
                GROUP BY submission_date
            ) AS daily_sub_max
            ON daily_hacker_data.submission_date = daily_sub_max.submission_date
            AND daily_hacker_data.sub_count = daily_sub_max.sub_max
        ) AS daily_max_hackers
        GROUP BY daily_max_hackers.submission_date
    ) AS daily_max
    ON daily_continuous.submission_date = daily_max.submission_date
    JOIN Hackers AS h ON h.hacker_id = daily_max.hacker_id
    ORDER BY daily_continuous.submission_date;