sql >> Databáze >  >> RDS >> Mysql

MYSQL - Seskupit podle limitu

Nemyslím si, že v MySQL existuje jednoduchý způsob. Jedním ze způsobů, jak toho dosáhnout, je vygenerovat číslo řádku pro každý řádek rozdělený do skupin podle rating_name a poté vybrat pouze řádky s row_number 2 nebo méně. Ve většině databází to můžete udělat pomocí něčeho jako:

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 bohužel nepodporuje ROW_NUMBER syntax. Můžete však simulovat ROW_NUMBER pomocí proměnných:

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

Výsledek při spuštění na vašich testovacích datech:

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. Ladění výkonu dotazů MySQL

  2. oracle - jaké výroky je třeba spáchat?

  3. Serializovatelná úroveň izolace

  4. Oracle:jak přidat minuty k časovému razítku?