Есть ли более быстрый способ сделать эту среднюю цену l oop? - PullRequest
1 голос
/ 12 февраля 2020

У меня есть функция, которая вычисляет среднюю цену чего-либо для желаемого количества. Допустим, это моя таблица:

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

Если я хочу получить среднюю цену на пункт А для некоторого количества, скажем, 35. Я oop над таблицей и складываю количество до $ итого больше, чем $ quanity (и чем затем), так что в этом случае строки 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 Ответ

1 голос
/ 12 февраля 2020

Один из способов - использовать 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

дБ <> fiddle здесь

Вместо использования GROUP BY & MIN, использование ROW_NUMBER для получения первого также может работать для этого.
Но я чувствую, что GROUP BY проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...