Как использовать sql group by для выбора 2 лучших элементов и суммирования одного поля? - PullRequest
0 голосов
/ 08 января 2020
Например,

, у меня есть данные, как показано ниже, и я хочу использовать group by и limit, чтобы выбрать каждого исполнителя в топ-2 песен большинства звезд и суммировать звезды, но это не работает

select sum(stars) from fav_songs group by artist order by stars desc limit 2;

То, что я хотел получить, выглядит следующим образом:

600 -> taylor swift  
350 -> eminem  
520 -> linkin park  

sqlite3 или mysql оба отлично

имя таблицы: fav_songs

| id | artist       | song           | stars |  
+----+--------------+----------------+-------+  
|  1 | Taylor Swift | Love Story     |   100 |  
|  2 | Taylor Swift | Enchanted      |   200 |  
|  3 | Taylor Swift | Safe and Sound |   400 |  
|  4 | Taylor Swift | Style          |   110 |  
|  5 | Eminem       | 8 Mile         |   200 |  
|  6 | Eminem       | the monster    |   100 |  
|  7 | Eminem       | lose yourself  |   150 |  
|  8 | Linkin Park  | in the end     |   210 |  
|  9 | Linkin Park  | faint          |    90 |  
| 10 | Linkin Park  | numb           |   310 |  

Кстати , редактор stackoverflow не поддерживает таблицу уценки ??

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Вы можете использовать коррелированный подзапрос с агрегацией:

select fs.artist, sum(fs.stars) 
from fav_songs fs
where fs.id in (select fs1.id 
                from fav_songs fs1 
                where fs1.artist = fs.artist 
                order by f1.stars desc 
                limit 2
               )
group by fs.artist; 

Если ваша версия поддерживает функцию ранжирования, вы можете сделать:

select fs.artist, sum(fs.stars)
from (select fs.*, 
             row_number() over(partition by fs.artist order by fs.stars desc) as seq
      from fav_songs fs
     ) fs
where fs.seq <= 2
group by fs.artist
1 голос
/ 08 января 2020

Если вы используете СУБД, которая поддерживает оконные функции, вы можете использовать номер строки:

select artist, sum(stars)
from (
    select t.*, row_number() over(partition by artist order by stars desc) rn
    from fav_songs
) t
where rn <= 2
group by artist
...