在只考虑经销商最新库存的情况下,如何获得每个品牌的平均值?
How do I get the average for each make while only considering a dealer's most current inventory?
我有以下 table:
CREATE TABLE inventory (
pk serial PRIMARY KEY
, make text
, inventory numeric
, dealer text
, updated date
);
以及以下数据:
INSERT INTO inventory (make, inventory, dealer, updated)
VALUES
('Toyota', 11, 'Jason', '2013-12-31'),
('Toyota', 47, 'Erika', '2013-12-31'),
('Toyota', 18, 'Jason', '2014-12-31'),
('Toyota', 7, 'Jason', '2015-03-31'),
('Toyota', 83, 'James', '2013-12-31'),
('Toyota', 45, 'Erika', '2014-02-28'),
('Honda', 17, 'James', '2013-12-31'),
('Ford', 32, 'Alan', '2015-07-31'),
('BMW', 98, 'Tom', '2013-05-05'),
('Honda', 43, 'Mary', '2014-06-14'),
('Honda', 9, 'Ronald', '2015-06-04'),
('Mercedes', 11, 'Jason', '2014-01-31'),
('Buick', 23, 'Jason', '2014-08-31'),
('Honda', 15, 'Mary', '2015-08-31')
每个经销商定期上传每个品牌的库存。我想获得每种汽车的平均库存,但只使用每个经销商的最新库存编号。
我可以为每个品牌一个一个地做:
SELECT make, AVG(inventory) FROM
(SELECT DISTINCT ON (dealer) dealer, * FROM inventory WHERE make = 'Toyota' ORDER BY dealer, updated DESC) t
GROUP BY make
缺点是我必须一次 运行 这个查询,并且必须提前知道 运行 的原因......我只想做 1 个查询并完成它,以便最终结果是:
make | avg
---------|----------
Toyota | 45.00000
Honda | 13.66667
Ford | 32.00000
BMW | 98.00000
Mercedes | 11.00000
Buick | 23.00000
我认为您可以在 ORDER BY
子句中包含 make
:
SELECT make, AVG(inventory)
FROM (SELECT DISTINCT ON (make, dealer) i.*
FROM inventory i
ORDER BY make, dealer, updated DESC
) t
GROUP BY make;
另一种方法是使用 ROW_NUMBER
window 函数来识别每个 make
和 dealer
组合
的最新 inventory
SELECT make,
Avg(inventory)
FROM (SELECT Row_number()OVER(partition BY make, dealer ORDER BY updated DESC)rn,
make,
inventory,
dealer,
updated
FROM inventory) A
WHERE rn = 1
GROUP BY make
我有以下 table:
CREATE TABLE inventory (
pk serial PRIMARY KEY
, make text
, inventory numeric
, dealer text
, updated date
);
以及以下数据:
INSERT INTO inventory (make, inventory, dealer, updated)
VALUES
('Toyota', 11, 'Jason', '2013-12-31'),
('Toyota', 47, 'Erika', '2013-12-31'),
('Toyota', 18, 'Jason', '2014-12-31'),
('Toyota', 7, 'Jason', '2015-03-31'),
('Toyota', 83, 'James', '2013-12-31'),
('Toyota', 45, 'Erika', '2014-02-28'),
('Honda', 17, 'James', '2013-12-31'),
('Ford', 32, 'Alan', '2015-07-31'),
('BMW', 98, 'Tom', '2013-05-05'),
('Honda', 43, 'Mary', '2014-06-14'),
('Honda', 9, 'Ronald', '2015-06-04'),
('Mercedes', 11, 'Jason', '2014-01-31'),
('Buick', 23, 'Jason', '2014-08-31'),
('Honda', 15, 'Mary', '2015-08-31')
每个经销商定期上传每个品牌的库存。我想获得每种汽车的平均库存,但只使用每个经销商的最新库存编号。
我可以为每个品牌一个一个地做:
SELECT make, AVG(inventory) FROM
(SELECT DISTINCT ON (dealer) dealer, * FROM inventory WHERE make = 'Toyota' ORDER BY dealer, updated DESC) t
GROUP BY make
缺点是我必须一次 运行 这个查询,并且必须提前知道 运行 的原因......我只想做 1 个查询并完成它,以便最终结果是:
make | avg
---------|----------
Toyota | 45.00000
Honda | 13.66667
Ford | 32.00000
BMW | 98.00000
Mercedes | 11.00000
Buick | 23.00000
我认为您可以在 ORDER BY
子句中包含 make
:
SELECT make, AVG(inventory)
FROM (SELECT DISTINCT ON (make, dealer) i.*
FROM inventory i
ORDER BY make, dealer, updated DESC
) t
GROUP BY make;
另一种方法是使用 ROW_NUMBER
window 函数来识别每个 make
和 dealer
组合
inventory
SELECT make,
Avg(inventory)
FROM (SELECT Row_number()OVER(partition BY make, dealer ORDER BY updated DESC)rn,
make,
inventory,
dealer,
updated
FROM inventory) A
WHERE rn = 1
GROUP BY make