1

我有一个表,它有 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)

我想添加一个百分比增加列并用正确的百分比填充它。

4

2 回答 2

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子句)和窗口函数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
于 2012-05-10T15:04:57.583 回答
2

我会说,添加百分比增加列是一次性操作,可以这样完成(文档中的详细信息):

ALTER TABLE target ADD pct float;

然后你可以更新表格,用新值填充它:

UPDATE target SET pct = (after::float - before::float) / before::float;
于 2012-05-10T14:30:47.377 回答