sql >> Database >  >> RDS >> Mysql

MYSQL - Groeperen op limiet

Ik denk niet dat er een eenvoudige manier is in MySQL. Een manier om dit te doen is door een rijnummer te genereren voor elke rij, gepartitioneerd in groepen op rating_name, en dan alleen de rijen te selecteren met rijnummer 2 of minder. In de meeste databases zou je dit kunnen doen met zoiets als:

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

Helaas ondersteunt MySQL de ROW_NUMBER . niet syntaxis. U kunt echter ROW_NUMBER simuleren variabelen gebruiken:

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

Resultaat wanneer uitgevoerd op uw testgegevens:

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. Praag PostgreSQL Meetup

  2. connect ECONNREFUSED - node js , sql

  3. Hoe het aantal rijen in sqlite te krijgen met Android?

  4. sqliteLog 14:kan bestand niet openen op regel