sql >> Databasteknik >  >> RDS >> Mysql

MYSQL - Gruppera efter gräns

Jag tror inte att det finns ett enkelt sätt i MySQL. Ett sätt att göra detta är genom att skapa ett radnummer för varje rad som är uppdelad i grupper efter rating_name och sedan bara välja raderna med radnummer 2 eller mindre. I de flesta databaser kan du göra detta med något 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

Tyvärr stöder inte MySQL ROW_NUMBER syntax. Du kan dock simulera ROW_NUMBER använda 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ör på dina 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. Hur schemalägger man en MySQL-fråga?

  2. Hur man installerar MariaDB-databasen i Debian 10

  3. Komma igång med Oracle Autonomous Database i molnet

  4. Bevisa SQL-fråga likvärdighet