Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL SELECT n записва на базата на GROUP BY

Примерни данни

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;

Първата опция е псевдо ранг, използващ променливи като The Scrum Meister показа, но представена тук като едно изявление

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;

Ако използвате това в преден край и се нуждаете само от 2 броя, тогава можете да използвате този формуляр, който връща броя в списък (единична колона)

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

Резултатът е

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

Ако е възможно да се появят връзки, тогава тази вариация на 2-ра форма премахва връзките и показва „най-добрите 2 отделни числа на държава“ като записи.

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

Резултат

"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 конектор оператор прехвърля само 64 байта

  2. Импортирането на 8GB mysql dump отнема много време

  3. MySQL lag/lead функция?

  4. Поддържа ли MS-SQL таблици в паметта?

  5. Проверете дали текущата дата е между две дати + заявка за избор на mysql