如何使用 sql 分组依据到 select 前 2 项并对一个字段求和?
How to use sql group by to select top 2 items and sum one field?
例如,我有如下数据,我想使用 group by
和 limit
到 select 每个艺术家前 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 都很好
table 姓名: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 |
顺便说一句,Whosebug 的编辑器不支持 table of markdown??
您可以将相关子查询与聚合一起使用:
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
如果您是运行支持window函数的RDBMS,您可以使用行号:
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
例如,我有如下数据,我想使用 group by
和 limit
到 select 每个艺术家前 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 都很好
table 姓名: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 |
顺便说一句,Whosebug 的编辑器不支持 table of markdown??
您可以将相关子查询与聚合一起使用:
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
如果您是运行支持window函数的RDBMS,您可以使用行号:
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