CREATE TABLE inventory (
id SERIAL PRIMARY KEY,
stock_date DATE,
inbound_quantity INT,
outbound_quantity INT
);
INSERT INTO inventory
(stock_date, inbound_quantity, outbound_quantity
)
VALUES
('2020-01-01', '900', '0'),
('2020-01-02', '0', '300'),
('2020-01-03', '400', '250'),
('2020-01-04', '0', '100'),
('2020-01-05', '700', '500');
Expected Output :
stock_date | inbound_quantity | outbound_quantity | balance |
---|---|---|---|
2020-01-01 | 900 | 0 | 900 |
2020-01-02 | 0 | 300 | 600 |
2020-01-03 | 400 | 250 | 750 |
2020-01-04 | 0 | 100 | 650 |
2020-01-05 | 700 | 500 | 850 |
Query:
SELECT
iv.stock_date AS stock_date,
iv.inbound_quantity AS inbound_quantity,
iv.outbound_quantity AS outbound_quantity,
SUM(iv.inbound_quantity - iv.outbound_quantity) OVER (ORDER BY stock_date ASC) AS Balance
FROM inventory iv
GROUP BY 1,2,3
ORDER BY 1;
With the above query I am able to calculate the balance of in bound_quantity
and outbound_quantity
in PostgresSQL.
However, when I run the same query in Amazon-Redshift
I get this error:
Amazon Invalid operation: Aggregate window functions with an ORDER BY clause require a frame clause; 1 statement failed.
How do I need to change the query to also make it work in Redshift?
As the error speaks, you need to add the frame specification clause, namely the ROWS UNBOUNDED PRECEDING
into your window function.
SELECT iv.stock_date AS stock_date,
iv.inbound_quantity AS inbound_quantity,
iv.outbound_quantity AS outbound_quantity,
SUM(iv.inbound_quantity - iv.outbound_quantity) OVER (
ORDER BY stock_date ASC
ROWS UNBOUNDED PRECEDING
) AS Balance
FROM inventory iv
GROUP BY 1,2,3
ORDER BY 1;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.