有没有更快速的方法来进行这种平均价格循环?

时间:2020-02-12 10:01:32

标签: mysql sql mariadb

我有一个函数,可以计算所需数量的平均价格。 假设这是我的桌子:

Name:    Quantity:     Price:
Item A     10               1
Item A     20               2
Item A     20               3
Item A     20               4

如果我想要某数量的商品A的平均价格,比如说35。我遍历表格并将数量加起来,直到$ total超过$ quanquan(而不是突破),这样就可以行1、2和3在这种情况下总计达到50。

那么,项A的平均价格为(10x1 + 20 x 2 + 20 x 3)/ 50 = 2.2,这就是我想要的输出。

但是,如果您对许多产品都这样做,那么这样做会很繁琐。

问题:

在我用来输出上表的查询中,是否有一种方法可以做到这一点?

类似的东西:
SELECT DISTINCT(Name) as item, SUM(quantity) as Howmuch, MIN(single) as Min FROM Items WHERE item = 'Item A' AND Howmuch > 30 ORDER BY single

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

一种方法是使用SUM OVER的总和。
然后从中得出平均值。

样本数据:

create table Items
(
  Name varchar(30),
  Quantity int,
  Price decimal(16,2)
);

insert into Items 
(Name, Quantity, Price)
values
('Item A', 10, 1),
('Item A', 20, 2),
('Item A', 20, 3),
('Item A', 20, 4);

查询:

SELECT Name
, MIN(CumPriceTotal)/MIN(CumQuantity) AS AvgPrice
FROM
(
  SELECT Name
  , SUM(Quantity*Price) OVER (PARTITION BY Name ORDER BY Price, Quantity) as CumPriceTotal
  , SUM(Quantity) OVER (PARTITION BY Name ORDER BY Price, Quantity) as CumQuantity
  FROM Items
) q
WHERE CumQuantity >= 35
GROUP BY Name
ORDER BY Name;
Name   | AvgPrice
:----- | -------:
Item A | 2.200000

db <>提琴here

代替使用GROUP BYMIN,使用ROW_NUMBER获得第一个也可以。
但是我觉得GROUP BY更简单。