Используйте это:
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
Но вы не можете остановиться на этом запросе, как насчет того, если на одном артисте есть два продукта, которые имеют самые высокие продажи? Вот как данные, как это ...
beatles yesterday 1000
beatles something 1000
elvis jailbreak rock 800
nirvana lithium 600
tomjones sexbomb 400
... приведет к выполнению следующего запроса:
beatles yesterday 1000
beatles something 1000
elvis jailbreak rock 800
Какой выбрать? вчера что ли? Поскольку вы не можете произвольно выбрать одно из другого, вы должны перечислить оба. Кроме того, что, если топ-10 самых продаваемых принадлежат битлз и являются галстуками, каждый из которых имеет количество 1000? Поскольку это самая лучшая вещь, которую вы избегаете (то есть сообщаете об одном и том же исполнителе в топ-3), вам нужно изменить запрос, чтобы отчет из топ-3 выглядел так:
beatles yesterday 1000
beatles something 1000
elvis jailbreak rock 800
nirvana lithium 600
Изменить:
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
Как насчет того, чтобы у "Битлз" был другой продукт, имеющий 900 кол-во? Будет ли работать приведенный выше запрос? Да, это все еще будет работать. Поскольку top_3 CTE относится только к уже отфильтрованному верхнему количеству каждого художника. Так что это исходные данные ...
beatles yesterday 1000
beatles something 1000
beatles and i love her 900
elvis jailbreak rock 800
nirvana lithium 600
tomjones sexbomb 400
... все равно приведет к следующему:
beatles yesterday 1000
beatles something 1000
elvis jailbreak rock 800
nirvana lithium 600