我有一个包含2列的表,列出了每个产品版本中特定项目的数量。我需要计算两列之间的百分比增加并将其附加到表中的新列,但是我没有找到任何与此相关的文档?我正在使用Postgres 9.0,我需要检查两列之间的百分比增长作为QC过程的一部分,以确保版本之间没有丢失/错误的数据。
以下是表格定义:
oid oid[] NOT NULL,
"State" character varying(2)[] NOT NULL,
release_1121 numeric NOT NULL,
release_1122 numeric NOT NULL,
CONSTRAINT oid PRIMARY KEY (oid)
我想添加百分比增加列,并使用正确的百分比填充它。
答案 0 :(得分:4)
我认为这就是你真正需要的东西:
表应如下所示:
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
clause)和窗口函数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
请勿使用oid
作为主键!这是不好的做法。在PostgreSQL 9.0中WITHOUT OIDS
是默认值。 Read more here.
如果可以避免"State"
,请不要使用{{1}}。参见:
答案 1 :(得分:0)
我想说,添加百分比增加列是一次性操作,可以这样做(details in the docs):
ALTER TABLE target ADD pct float;
然后你可以更新表格,用新值填充它:
UPDATE target SET pct = (after::float - before::float) / before::float;