У меня есть таблица 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
, но, похоже, это не так ...