Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MYSQL - Gruppieren nach Limit

Ich glaube nicht, dass es in MySQL einen einfachen Weg gibt. Eine Möglichkeit, dies zu tun, besteht darin, eine Zeilennummer für jede Zeile zu generieren, die nach Bewertungsname in Gruppen unterteilt ist, und dann nur die Zeilen mit Zeilennummer 2 oder weniger auszuwählen. In den meisten Datenbanken können Sie dies folgendermaßen tun:

SELECT * FROM (
    SELECT
        rating_name,
        etc...,
        ROW_NUMBER() OVER (PARTITION BY rating_name ORDER BY good) AS rn
    FROM your_table
) T1
WHERE rn <= 2

Leider unterstützt MySQL die ROW_NUMBER nicht Syntax. Sie können jedoch ROW_NUMBER simulieren Variablen verwenden:

SELECT
    rating_name, id_markets, good, neutral, bad
FROM (
    SELECT
        *,
        @rn := CASE WHEN @prev_rating_name = rating_name THEN @rn + 1 ELSE 1 END AS rn,
        @prev_rating_name := rating_name
    FROM (
        SELECT
            rating_name,
            id_markets,
            SUM(COALESCE(rating_good, 0)) AS good,
            SUM(COALESCE(rating_neutral, 0)) AS neutral,
            SUM(COALESCE(rating_bad, 0)) AS bad
        FROM zzratings
        WHERE rating_year = YEAR(CURDATE()) AND rating_week = WEEK(CURDATE(), 1)
        GROUP BY rating_name, id_markets
    ) AS T1, (SELECT @prev_rating_name := '', @rn := 0) AS vars
    ORDER BY rating_name, good DESC
) AS T2
WHERE rn <= 2
ORDER BY rating_name, good DESC

Ergebnis bei Ausführung mit Ihren Testdaten:

france    1  2  0  0
france    2  1  0  0
ireland   1  4  2  0
ireland  21  3  1  0
poland    1  3  1  0
poland    2  1  0  0