我有一张表格,跟踪某些商店和产品的股票变化。该值为绝对库存量,但只有在库存发生变化时才插入新行。此设计是为了保持表格小,因为预计会迅速增长。
以下是示例模式和一些测试数据:
CREATE TABLE stocks (
id serial NOT NULL,
store_id integer NOT NULL,
product_id integer NOT NULL,
date date NOT NULL,
value integer NOT NULL,
CONSTRAINT stocks_pkey PRIMARY KEY (id),
CONSTRAINT stocks_store_id_product_id_date_key
UNIQUE (store_id, product_id, date)
);
insert into stocks(store_id, product_id, date, value) values
(1,10,'2013-01-05', 4),
(1,10,'2013-01-09', 7),
(1,10,'2013-01-11', 5),
(1,11,'2013-01-05', 8),
(2,10,'2013-01-04', 12),
(2,11,'2012-12-04', 23);
我需要能够确定每个产品和商店在起始日期和结束日期之间的平均库存,但我的问题是简单的avg()函数没有考虑到库存在变化之间保持不变的情况。
我希望得到类似以下的结果:
select s.store_id, s.product_id , special_avg(s.value)
from stocks s where s.date between '2013-01-01' and '2013-01-15'
group by s.store_id, s.product_id
结果会像这样:
store_id product_id avg
1 10 3.6666666667
1 11 5.8666666667
2 10 9.6
2 11 23
为了使用SQL平均函数,我需要“向前传播”store_id和product_id的先前值,直到发生新变化。你有什么想法如何实现这一点?