我认为这是你真正需要的:
表应如下所示:
CREATE TABLE release (
release_id integer PRIMARY KEY, -- pk is NOT NULL automatically
-- state varchar(2)[] NOT NULL, -- ??
amount numeric NOT NULL
);
测试数据:
INSERT INTO release VALUES (release_id, amount)
(1121, 25)
, (1122, 30)
, (1123, 90)
, (1124, 10);
询问:
WITH x AS (
SELECT *
, lag(amount) OVER (ORDER BY release_id) as last_amount
FROM release
)
SELECT release_id, amount
, (amount - last_amount) AS abs_change
, round((100 * (amount - last_amount)) / last_amount, 2) AS percent_change
FROM x
ORDER BY release_id;
CTE(WITH
子句)和窗口函数lag()
需要 PostgreSQL 8.4 或更高版本。
结果:
release_id | amount | abs_change | percent_change
-----------+--------+------------+---------------
1121 | 25 | <NULL> | <NULL>
1122 | 30 | 5 | 20.00
1123 | 90 | 60 | 200.00
1124 | 10 | -80 | -88.89