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

Bruger du LIMIT i GROUP BY for at få N resultater pr. gruppe?

Du kan bruge GROUP_CONCAT aggregeret funktion for at få alle år i en enkelt kolonne, grupperet efter id og sorteret efter rate :

SELECT   id, GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
FROM     yourtable
GROUP BY id
 

Resultat:

----------------------------------------------------------- | ID | GROUPED_YEAR | ----------------------------------------------------------- | p01 | 2006,2003,2008,2001,2007,2009,2002,2004,2005,2000 | | p02 | 2001,2004,2002,2003,2000,2006,2007 | -----------------------------------------------------------

Og så kunne du bruge FIND_IN_SET , der returnerer positionen af ​​det første argument inde i det andet, f.eks.

SELECT FIND_IN_SET('2006', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000'); 1 SELECT FIND_IN_SET('2009', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000'); 6

Brug af en kombination af GROUP_CONCAT og FIND_IN_SET , og filtrering efter positionen returneret af find_in_set, kan du derefter bruge denne forespørgsel, der kun returnerer de første 5 år for hvert id:

SELECT
  yourtable.*
FROM
  yourtable INNER JOIN (
    SELECT
      id,
      GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
    FROM
      yourtable
    GROUP BY id) group_max
  ON yourtable.id = group_max.id
     AND FIND_IN_SET(year, grouped_year) BETWEEN 1 AND 5
ORDER BY
  yourtable.id, yourtable.year DESC;
 

Se venligst violin her .

Bemærk venligst, at hvis mere end én række kan have samme kurs, bør du overveje at bruge GROUP_CONCAT(DISTINCT rate ORDER BY rate) på kurskolonnen i stedet for årkolonnen.

Den maksimale længde af strengen, der returneres af GROUP_CONCAT, er begrænset, så dette fungerer godt, hvis du skal vælge nogle få poster for hver gruppe.



  1. Returner ikke-numeriske værdier fra en PostgreSQL-databasekolonne

  2. SQLite - Indsæt data

  3. MySQL-ændringssamling af alle tabeller

  4. Beskæftiger sig med dato og klokkeslæt i stedet for datetime