Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Używasz LIMIT w GROUP BY, aby uzyskać N wyników na grupę?

Możesz użyć GROUP_CONCAT zagregowana funkcja, aby zebrać wszystkie lata w jednej kolumnie, pogrupowane według id i uporządkowane według rate :

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

Wynik:

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

A potem możesz użyć ZNAJDŹ_W_ZESTAWIE , który zwraca pozycję pierwszego argumentu wewnątrz drugiego, np.

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

Używając kombinacji GROUP_CONCAT i FIND_IN_SET , i filtrując według pozycji zwróconej przez find_in_set, możesz użyć tego zapytania, które zwraca tylko pierwsze 5 lat dla każdego identyfikatora:

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;

Zobacz skrzypce tutaj .

Należy pamiętać, że jeśli więcej niż jeden wiersz może mieć tę samą stawkę, należy rozważyć użycie GROUP_CONCAT(DISTINCT rate ORDER BY stawki) w kolumnie stawki zamiast w kolumnie roku.

Maksymalna długość ciągu zwracanego przez GROUP_CONCAT jest ograniczona, więc działa to dobrze, jeśli musisz wybrać kilka rekordów dla każdej grupy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Eksportuj i importuj wszystkie bazy danych MySQL jednocześnie

  2. Zmień kolejność / zresetuj klucz główny automatycznego przyrostu

  3. Jak usunąć użytkownika bazy danych MySQL w cPanel?

  4. mysql jak zwiększenie wydajności

  5. Jak przechowywać wiele opcji w jednej tabeli?