create table sales as with sales(artist,song, qty) as ( values ('beatles','yesterday',1000), ('beatles','something',1000), ('beatles','and i love her', 900), ('elvis', 'jailbreak rock', 800), ('nirvana','lithium', 600), ('tomjones','sexbomb', 400) ) select * from sales
Desired output:
artist | song | qty ---------+----------------+------ beatles | yesterday | 1000 beatles | something | 1000 elvis | jailbreak rock | 800 nirvana | lithium | 600 (4 rows)
Using MAX:
with each_artist_top_selling_product as ( select artist, song, qty from sales x where qty = (select max(qty) from sales where artist = x.artist) ), top_n_total as ( select distinct qty from each_artist_top_selling_product order by qty desc limit 3 ) select * from each_artist_top_selling_product where qty in (select qty from top_n_total) order by qty desc
Using DENSE_RANK instead:
with each_artist_top_selling_product as ( select * from ( select artist, song, qty, dense_rank() over(partition by artist order by qty desc) rn from sales ) as x where rn = 1 ), top_n_total as ( select distinct qty from each_artist_top_selling_product order by qty desc limit 3 ) select * from each_artist_top_selling_product where qty in (select qty from top_n_total) order by qty desc
No comments:
Post a Comment