sql >> Database teknologi >  >> RDS >> Mysql

MYSQL - Gruppér efter grænse

Jeg tror ikke, der er en enkel måde i MySQL. En måde at gøre dette på er ved at generere et rækkenummer for hver række opdelt i grupper efter rating_name, og derefter kun vælge rækkerne med rækkenummer 2 eller mindre. I de fleste databaser kan du gøre dette ved at bruge noget som:

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

MySQL understøtter desværre ikke ROW_NUMBER syntaks. Du kan dog simulere ROW_NUMBER ved hjælp af variabler:

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

Resultat, når du kører på dine testdata:

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


  1. Hvorfor MySQL giver fejl Ikke tilladt at returnere et resultatsæt fra en funktion?

  2. Installation af RODBC/ROracle-pakker på OS X Mavericks

  3. Konverter 'tid' til 'datetime2' i SQL Server (T-SQL-eksempler)

  4. MySQL-Cluster starter ikke