Postgresql:在日期限制内的平均值,分组依据

时间:2019-05-24 09:43:58

标签: postgresql

我有一张这样的桌子

item_id    date          number
1          2000-01-01    100
1          2003-03-08    50
1          2004-04-21    10
1          2004-12-11    10
1          2010-03-03    10
2          2000-06-29    1
2          2002-05-22    2
2          2002-07-06    3
2          2008-10-20    4

我正在尝试获取最近3个日期中每个uniq Item_id的平均值。 这很困难,因为之间缺少日期,因此一定范围的硬编码日期并不总是有效。

我希望得到这样的结果:

item_id   MyAverage
1          10
2          3

我真的不知道该怎么做。目前,我设法完成一项任务,但是我很难将其扩展到多项任务:

SELECT AVG(MyAverage.number) FROM ( 
  SELECT date,number 
  FROM item_list 
  where item_id = 1 
  ORDER BY date  DESC limit 3
) as MyAverage;

我的主要问题是将"DESC limit 3"推广到group by id

尝试:

SELECT item_id,AVG(MyAverage.number) 
FROM ( 
  SELECT item_id,date,number 
  FROM item_list 
  ORDER BY date  DESC limit 3) as MyAverage 
GROUP BY item_id;

极限把事情搞砸了。

我已经在日期和日期之间使用它来“工作”,但是它不能按我的意愿工作,因为我需要一个限制而不是一个硬编码的日期。

任何人都可以帮忙

1 个答案:

答案 0 :(得分:0)

您可以使用row_number()1分配给3的记录,记录的最后日期为ID,然后对其进行过滤。

SELECT x.item_id,
       avg(x.number)
       FROM (SELECT il.item_id,
                    il.number,
                    row_number() OVER (PARTITION BY il.item_id
                                       ORDER BY il.date DESC) rn
                    FROM item_list il) x
       WHERE x.rn BETWEEN 1 AND 3
       GROUP BY x.item_id;