Utilisez ceci:
with summed_sales_of_each_product as
(
select p.artist_name, p.product_id, sum(i.qty) as total
from product p join order_item i
on i.product_id = p.product_id
group by p.artist_name, p.product_id
),
each_artist_top_selling_product as
(
select x_in.artist_name, x_in.product_id, x_in.total
from summed_sales_of_each_product x_in where total =
(select max(x_out.total)
from summed_sales_of_each_product x_out
where x_out.artist_name = x_in.artist_name)
)
select top 3
artist_name, product_id, total
from each_artist_top_selling_product
order by total desc
Mais vous ne pouvez pas arrêter à cette requête, que diriez-vous s'il y a deux produits sur un artiste qui sont cravates sur la vente la plus élevée? Voici comment les données comme celui-ci ...
beatles yesterday 1000
beatles something 1000
elvis jailbreak rock 800
nirvana lithium 600
tomjones sexbomb 400
... se traduira par la suite en utilisant la requête ci-dessus:
beatles yesterday 1000
beatles something 1000
elvis jailbreak rock 800
Lequel choisir? hier ou quelque chose? Puisque vous ne pouvez pas arbitrairement choisir l'un sur l'autre, vous devez énumérer les deux. Aussi, que se passe-t-il si le top 10 des ventes les plus importantes appartient aux beatles et sont des cravates, chacune avec une quantité de 1000? Puisque c'est la meilleure chose que vous évitez (la déclaration même artiste sur 3), vous devez modifier la requête afin que le top 3 rapport ressemblera à ceci:
beatles yesterday 1000
beatles something 1000
elvis jailbreak rock 800
nirvana lithium 600
Modifiant:
with summed_sales_of_each_product as
(
select p.artist_name, p.product_id, sum(i.qty) as total
from product p join order_item i
on i.product_id = p.product_id
group by p.artist_name, p.product_id
),
each_artist_top_selling_product as
(
select x_in.artist_name, x_in.product_id, x_in.total
from summed_sales_of_each_product x_in
where x_in.total =
(select max(x_out.total)
from summed_sales_of_each_product x_out
where x_out.artist_name = x_in.artist_name)
),
top_3_total as
(
select distinct top 3 total
from each_artist_top_selling_product
order by total desc
)
select artist_name, product_id, total
from each_artist_top_selling_product
where total in (select total from top_3_total)
order by total desc
Que diriez-vous si les beatles ont un autre produit qui a 900 qté? La requête ci-dessus fonctionnera-t-elle toujours? Oui, ça marchera toujours. Puisque le top_3 CTE ne s'occupe que de la quantité supérieure déjà filtrée sur chaque artiste. Donc, cette source de données ...
beatles yesterday 1000
beatles something 1000
beatles and i love her 900
elvis jailbreak rock 800
nirvana lithium 600
tomjones sexbomb 400
...résultera toujours à ce qui suit:
beatles yesterday 1000
beatles something 1000
elvis jailbreak rock 800
nirvana lithium 600
Un artiste peut avoir plusieurs produits pour la requête ne doit pas tirer Jimi Hendrix 2x dans les résultats. – Todd
Mais la valeur de la quantité est-elle la valeur unique la plus élevée pour l'artiste, ou la somme de toutes les quantités? –
Il veut que les trois artistes réussissent le mieux à produire des albums individuels. – egrunin