【发布时间】:2020-04-17 18:54:43
【问题描述】:
我有一张表prices 保存一些产品的所有价格:
CREATE TABLE prices (
id INT,
product_id INT, /*Foreign key*/
created_at TIMESTAMP,
price INT
);
product_id 的第一个实体是它的初始销售价格。如果产品随后减少,则将添加一个新实体。
我想找出所有产品每天的平均价格和总价格变化。
这是一些示例数据:
INSERT INTO prices (id, product_id, created_at, price) VALUES (1, 1, '2020-01-01', 11000);
INSERT INTO prices (id, product_id, created_at, price) VALUES (2, 2, '2020-01-01', 3999);
INSERT INTO prices (id, product_id, created_at, price) VALUES (3, 3, '2020-01-01', 9999);
INSERT INTO prices (id, product_id, created_at, price) VALUES (4, 4, '2020-01-01', 2000);
INSERT INTO prices (id, product_id, created_at, price) VALUES (5, 1, '2020-01-02', 9999);
INSERT INTO prices (id, product_id, created_at, price) VALUES (6, 2, '2020-01-02', 2999);
INSERT INTO prices (id, product_id, created_at, price) VALUES (7, 5, '2020-01-02', 2999);
INSERT INTO prices (id, product_id, created_at, price) VALUES (8, 1, '2020-01-03', 8999);
INSERT INTO prices (id, product_id, created_at, price) VALUES (9, 1, '2020-01-03 10:00:00', 7000);
INSERT INTO prices (id, product_id, created_at, price) VALUES (10, 5, '2020-01-03', 4000);
INSERT INTO prices (id, product_id, created_at, price) VALUES (11, 6, '2020-01-03', 3999);
INSERT INTO prices (id, product_id, created_at, price) VALUES (12, 3, '2020-01-03', 6999);
预期的结果应该是:
date mean_price_change total_price_change
2020-01-01 0 0
2020-01-02 1000.5 2001
2020-01-03 1666 4998
说明:
- “2020-01-01”的平均降价和总计为 0,因为所有产品在该日期都是新的。
- 在“2020-01-02”上,平均价格变化为:(11000-9999 + 3999-2999)/2 = 1000.5,因为 product_id
1和2都已减少到 9999 和 2999天,它们之前的价格是 11000 和 3999,总共减少了:(11000-9999 + 3999-2999) = 2001。 - 在“2020-01-03”上,仅更改了 product_id
1、3和5。1在一天中的两个不同时间:9999 => 8999 => 7000(最后一次执政)和3:从 9999 => 6999 a 然后5:从 2999 => 4000 上升。这给出了总计:(9999-7000 + 9999-6999 + 2999-4000) = 4998 当天平均降价:1666
我这里也添加了数据:https://www.db-fiddle.com/f/tJgoKFMJxcyg5gLDZMEP77/1
我说要玩一些DISTINCT ON,但似乎没有这样做......
【问题讨论】:
-
同一产品在同一日期有两个价格,这让我感到困惑。
标签: sql postgresql business-intelligence