在只考虑经销商最新库存的情况下,如何获得每个品牌的平均值?

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 函数来识别每个 makedealer 组合

的最新 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 

SQL FIDDLE DEMO