15 Days of Learning SQL

  • + 0 comments

    MS SQL SERVER

    WITH TBL1 AS ( -- all hacker_id who made at least one submission each day
        SELECT DISTINCT
            submission_date
            ,hacker_id
        From Submissions Sub
        WHERE hacker_id IN (
            SELECT DISTINCT hacker_id 
            FROM Submissions 
            WHERE submission_date <= Sub.submission_date
            GROUP BY hacker_id
            HAVING COUNT(DISTINCT submission_date) = (
                SELECT COUNT(DISTINCT submission_date)
                FROM Submissions
                WHERE submission_date <= Sub.submission_date
            )
        )
    )
    ,TBL2 AS ( --no of unique hacker_id who made at least one submission each day
        SELECT
            submission_date
            ,COUNT(hacker_id) AS hackerNr
        From TBL1
        GROUP BY submission_date
    )
    ,TBL3 AS ( -- number of submissions made by hacker each day
        SELECT 
            hacker_id
            ,submission_date
            ,COUNT(submission_id) AS nrSub 
        FROM Submissions 
        GROUP BY hacker_id, submission_date
    )
    ,TBL4 AS ( -- lowest hacker_id each day
        SELECT DISTINCT
            T1.submission_date
            ,T2.hackerNr
            ,MIN(T3.hacker_id) AS hackerID
        FROM TBL1 T1
        LEFT JOIN TBL2 T2 ON T1.submission_date = T2.submission_date
        LEFT JOIN TBL3 T3 ON T1.submission_date = T3.submission_date
        WHERE T3.nrSub = (SELECT MAX(nrSub) FROM TBL3 WHERE submission_date = T1.submission_date GROUP BY submission_date)
        GROUP BY T1.submission_date, T2.hackerNr
    )
    SELECT 
        TBL4.*
        ,H.name
    FROM TBL4
    LEFT JOIN Hackers H ON H.hacker_id = TBL4.hackerID
    ORDER BY TBL4.submission_date