我很抱歉,如果这看起来太容易了,但我被问到这个问题,即使在彻底准备SQL之后我也无法回答:(。有人可以回答这个问题吗?
有一张表 - 卖家ID,产品ID,仓库ID,每个产品的每个产品的数量,按照每个卖家。
我们必须列出具有卖方ID的产品ID,该产品ID具有该产品的最高产品数量以及他对该产品的总产品数量。
我觉得我很困惑,因为表中有3个键。
答案 0 :(得分:1)
目前还不清楚您使用的是哪个DBMS。如果您的DBMS支持窗口正常运行,则以下内容应该有效。
您可以找到每个产品和卖家的行数,使用窗口函数rank
对每个产品中的每个卖家进行排名,然后使用过滤器来获取每个产品中排名最高的卖家以及单位数。
select
product_id,
seller_id,
no_of_products
from (
select
product_id,
seller_id,
count(*) no_of_products,
rank() over (partition by product_id order by count(*) desc) rnk
from your_table
group by
product_id,
seller_id
) t where rnk = 1;
如果不支持窗口函数,则可以使用相关查询来实现相同的效果:
select
product_id,
seller_id,
count(*) no_of_products
from your_table a
group by
product_id,
seller_id
having count(*) = (
select max(cnt)
from (
select count(*) cnt
from your_table b
where b.product_id = a.product_id
group by seller_id
) t
);
答案 1 :(得分:0)
不知道为什么让id列会让你感到困惑......按正确的列分组,总计总数并返回第一行:
select *
from (
select sellerid, productid, sum(quantity) as total_sold
from theres_a_table
group by sellerid, productid
) x
order by total_sold desc
fetch first 1 row only
答案 2 :(得分:0)
如果我不考虑优化,直接回答就是这样
select *
from
(
select seller_id, product_id, sum(product_qty) as seller_prod_qty
from your_table
group by seller_id, product_id
) spqo
inner join
(
select product_id, max(seller_prod_qty) as max_prod_qty
from
(
select seller_id, product_id, sum(product_qty) as seller_prod_qty
from your_table
group by seller_id, product_id
) spqi
group by product_id
) pmaxq
on spqo.product_id = pmaxq.product_id
and spqo.seller_prod_qty = pmaxq.max_prod_qty
spqi(内部)和sqpo(外部)都为您提供卖方,产品,仓库数量总和。 pmaxq在仓库中再次给出每个产品的最大值,然后如果卖方具有最高(最大)的产品(可能是具有相同数量的多个卖方),则最终内部连接将获取数量总和。我想这就是你要找的答案。但是,我确信可以改进查询,因为我发布的是"概念"一:)