Mysql
 sql >> Base de données >  >> RDS >> Mysql

MYSQL - Regrouper par limite

Je ne pense pas qu'il existe un moyen simple dans MySQL. Une façon de procéder consiste à générer un numéro de ligne pour chaque ligne partitionnée en groupes par nom_évaluation, puis à ne sélectionner que les lignes avec numéro_ligne 2 ou moins. Dans la plupart des bases de données, vous pouvez le faire en utilisant quelque chose comme :

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

Malheureusement, MySQL ne prend pas en charge le ROW_NUMBER syntaxe. Vous pouvez cependant simuler ROW_NUMBER en utilisant des variables :

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

Résultat lors de l'exécution sur vos données de test :

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