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

MySQL SELECT n rekordów na podstawie GROUP BY

Przykładowe dane

create table data (Country varchar(10), Number int);
insert into data select
'USA' , 300 union all select
'USA' , 450 union all select
'USA' , 500 union all select
'USA' , 100 union all select
'FR'  , 100 union all select
'FR'  , 420 union all select
'UK'  , 300 union all select
'UK'  , 400 union all select
'UK'  , 1000;

Pierwsza opcja to pseudoranking wykorzystujący zmienne, takie jak pokazał The Scrum Meister, ale przedstawiony tutaj jako pojedyncza instrukcja

SELECT Country, Number
FROM (
    SELECT
        Number,
        @r := case when @c=country then @r+1 else 1 end rownum,
        @c := Country Country 
    FROM (select @r :=0 , @c := '') x, data
    ORDER BY Country, Number DESC
) y
WHERE rownum < 3;

Jeśli używasz tego w interfejsie i potrzebujesz tylko 2 zliczeń, możesz użyć tego formularza, który zwraca liczby na liście (pojedyncza kolumna)

SELECT
    Country,
    left(x,locate(',',concat(x,','),locate(',',x)+1)-1) Numbers
FROM (
    SELECT
        a.Country,
        Group_Concat(a.Number) x
    From (
        select country, number
        from data
        order by country, number desc) a
    group by a.Country
) b

Wynik to

"Country";"Numbers"
"FR";"420,100"
"UK";"1000,400"
"USA";"500,450"

Jeśli istnieje możliwość wystąpienia remisów, ta odmiana drugiej formy usuwa remisy i pokazuje jako rekordy „dwie pierwsze różne liczby na kraj”.

SELECT distinct x.Country, x.Number
From data x
inner join
(
    SELECT
        Country,
        left(x,locate(',',concat(x,','),locate(',',x)+1)-1) Numbers
    FROM (
        SELECT
            a.Country,
            Group_Concat(a.Number) x
        From (
            select distinct country, number
            from data
            order by country, number desc) a
        group by a.Country
    ) b
) y on x.Country=y.Country
    and concat(',',y.Numbers,',') like concat('%,',x.Number,',%')
order by x.Country, x.Number Desc

Wynik

"Country";"Number"
"FR";"420"
"FR";"100"
"UK";"1000"
"UK";"400"
"USA";"500"
"USA";"450"


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL wyłącza i włącza klawisze

  2. Mysql:Kolejność wyników z select <nazwa pola> z jest inna niż kolejność wyników z select * z

  3. MySQL — jeśli zaczyna się od cyfry lub znaku specjalnego

  4. mysqli multiple query - ustawianie zmiennej generuje błąd logiczny/jak to pominąć?

  5. MySQL Connector dołącza wyliczenie z wartością o jeden mniejszą niż rzeczywista