DB-Fiddle

CREATE TABLE logistics (
    id SERIAL PRIMARY KEY,
    time_stamp DATE,
    product VARCHAR(255),
    quantity INT
);

INSERT INTO logistics
(time_stamp, product, quantity)
VALUES 
('2020-01-14', 'Product_A', '100'),
('2020-01-14', 'Product_B', '300'),

('2020-01-15', 'Product_B', '400'),
('2020-01-15', 'Product_C', '350'),

('2020-01-16', 'Product_B', '530'),
('2020-01-16', 'Product_C', '350'),
('2020-01-16', 'Product_D', '670'),

('2020-01-17', 'Product_C', '500'),
('2020-01-17', 'Product_D', '980'),
('2020-01-17', 'Product_E', '700'),
('2020-01-17', 'Product_F', '450');

Ожидаемый результат:

time_stamp  |   difference   |           info
------------|----------------|--------------------------------------
2020-01-14  |       400      |       =(100+300)
2020-01-15  |       350      |       =(400+350)-(300+100)
2020-01-16  |       800      |       =(530+350+670)-(400+350)
2020-01-17  |      1080      |       =(500+980+700+450)-(530+350+670)

Я хочу рассчитать общую разницу quantity между двумя timestamps.
Поэтому я попытался использовать запрос из этот вопрос:

SELECT
t1.time_stamp AS time_stamp,
t1.quantity AS quantity,
COALESCE(t1.quantity-LAG(t1.quantity) OVER (PARTITION BY t1.time_stamp ORDER BY t1.time_stamp), t1.quantity) AS difference
FROM 

  (SELECT
  l.time_stamp AS time_stamp, 
  SUM(l.quantity) AS quantity
  FROM logistics l
  GROUP BY 1
  ORDER BY 1) t1

GROUP BY 1,2
ORDER BY 1,2;

Однако я не могу получить ожидаемый результат.
Что мне нужно изменить, чтобы заставить его работать?

1
Michi 18 Янв 2022 в 13:11

2 ответа

Вы можете использовать это:

select time_stamp
      ,s-COALESCE(LAG(t1.s) OVER  (ORDER BY t1.time_stamp),0)  as difference    
from 
 (select time_stamp,sum(quantity) as s 
       from logistics 
       group by time_stamp)t1

Выход:

time_stamp  difference    
2020-01-14  400
2020-01-15  350
2020-01-16  800
2020-01-17  1080
0
Saeed EmamYari 18 Янв 2022 в 13:25

Вы также можете использовать предложение with, сначала вычислите сумму, а затем проще вычислить отставание:

with _sum as (
SELECT distinct
logistics.time_stamp AS time_stamp,
sum(quantity) over (PARTITION by time_stamp) as summe
from logistics
order by time_stamp
)
select 
time_stamp,
summe - coalesce(lag(summe) over (order by time_stamp),0)
from _sum
0
FatFreddy 18 Янв 2022 в 13:29