Grupowanie z ograniczeniem

Potrzebowałem ostatnio zapytania, które zgrupuje wyniki po danej kolumnie i zwróci je wraz z ilością wystąpień – czyli banał. Dopiero dodanie warunku, aby zapytanie zwracało wyniki tylko dla 5 rekordów o największej zliczonej wartości wymagało chwili pisania. Listing poniżej.

SELECT
    ip, costam_id, ile
FROM (
    SELECT
        *,
        @rn := CASE WHEN @prev_ip = ip THEN @rn + 1 ELSE 1 END AS rn,
        @prev_ip := ip
    FROM (
        SELECT
            ip,
            costam_id,
            count(1) as ile
        FROM play
        GROUP BY ip, costam_id
    ) AS T1, (SELECT @prev_ip := '', @rn := 0) AS vars
    ORDER BY ip, ile DESC
) AS T2
WHERE rn <= 5
ORDER BY ip, ile  DESC