我会留下另一个答案,因为我认为这看起来更像是这样的表结构。
但是您在另一个线程中描述了一个如下所示的表:
create table store_data (
store varchar2(40),
product varchar2(40),
subproduct varchar2(40),
sales int);
这实际上看起来像是已经聚合的数据,您现在确实想要再次分析。您的查询可能如下所示。它首先汇总销售额的总和,因此您也可以按销售额订购商店和产品(表中的销售额似乎是针对子产品的。之后,您可以按销售额为商店和产品添加排名。我添加了一个对子产品也进行排名。我在这里使用了排名,所以当更多记录具有相同的销售额时,编号会有差距。这样,当您获得 8 条排名为 1 的记录时,因为它们都具有相同的销售额,第 6 条记录实际上排名 9 而不是 2,因此您将只选择 8 家顶级商店(您想要 5 家,但如果它们实际上销售完全相同,为什么要跳过其他 3 家)而不是其他 4 家。
select
ts.*
from
(
select
ss.*,
rank() over (order by storesales) as storerank,
rank() over (partition by store order by productsales) as productrank,
rank() over (partition by store, product order by subproductsales) as subproductrank
from
(
select
sd.*,
sum(sales) over (partition by store) as STORESALES,
sum(sales) over (partition by store, product) as PRODUCTSALES,
sum(sales) over (partition by store, product, subproduct) as SUBPRODUCTSALES
from
store_data sd
) ss
) ts
where
ts.storerank <= 2 and
ts.productrank <= 3 and
ts.subproductrank <= 4