Database design 计算两列之间的百分比变化
我有一个表,它有两列,列出了每个产品版本中特定项目的数量。我需要计算两列之间的百分比增长,并将其附加到表中的一个新列,但是我没有找到任何与此相关的文档?我使用的是Postgres 9.0,我需要检查两列之间的百分比增加,作为质量控制过程的一部分,以确保版本之间没有丢失/错误的数据 以下是表格定义:Database design 计算两列之间的百分比变化,database-design,percentage,postgresql,Database Design,Percentage,Postgresql,我有一个表,它有两列,列出了每个产品版本中特定项目的数量。我需要计算两列之间的百分比增长,并将其附加到表中的一个新列,但是我没有找到任何与此相关的文档?我使用的是Postgres 9.0,我需要检查两列之间的百分比增加,作为质量控制过程的一部分,以确保版本之间没有丢失/错误的数据 以下是表格定义: oid oid[] NOT NULL, "State" character varying(2)[] NOT NULL, release_1121 numeric NOT NULL, release_
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)
我想添加一个百分比增加列,并用正确的百分比填充它。我想说,添加百分比增加列是一次性操作,可以这样做(): 然后可以更新该表,并用新值填充它:
UPDATE target SET pct = (after::float - before::float) / before::float;
我想说,添加百分比增加列是一次性操作,可以这样做(): 然后可以更新该表,并用新值填充它:
UPDATE target SET pct = (after::float - before::float) / before::float;
我认为这是你真正需要的:
表应该如下所示:
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;
和窗口功能需要PostgreSQL 8.4或更高版本。结果:
release|u id | amount | abs|u change | percent|u change
-----------+--------+------------+---------------
1121 | 25 | |
1122 | 30 | 5 | 20.00
1123 | 90 | 60 | 200.00
1124 | 10 | -80 | -88.89
- 不要将
用作主键!这是个坏习惯。在PostgreSQL 9.0中是默认值oid
- 如果可以避免的话,不要使用like
。见:“State”
- 我认为这是您真正需要的:
表应该如下所示:
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;
和窗口功能需要PostgreSQL 8.4或更高版本。结果:
release|u id | amount | abs|u change | percent|u change
-----------+--------+------------+---------------
1121 | 25 | |
1122 | 30 | 5 | 20.00
1123 | 90 | 60 | 200.00
1124 | 10 | -80 | -88.89
- 不要将
用作主键!这是个坏习惯。在PostgreSQL 9.0中是默认值oid
- 如果可以避免的话,不要使用like
。见:“State”
release
表,其中每个版本有一个金额,并且有一个视图/函数计算所有/选定版本之间的更改。不是用于发布之间的增量的表。此外,请提及您的Postgres版本和计算的预期目的(以便更好地理解您的需要)。1121122-这些是字段名称还是值?请在此发布完整的表定义。并向我们展示您迄今为止所做的工作。似乎应该有一个release
表,其中每个版本有一个金额,并且有一个视图/函数计算所有/选定版本之间的更改。不是用于发布之间的增量的表。另外,请提及你的博士后版本和计算的预期目的(以便更好地理解你需要什么)。这正是我在得到你的答案之前所想的建议!没有多余的金额存储,因此如果发现一个金额不正确,您修复该金额,您就完成了;无需查找冗余副本或重新计算依赖值。@kgrittn:同样的想法,可能是因为这是避免冗余存储的明显途径。:)这正是我在得到你的答案之前想提出的建议!没有多余的金额存储,因此如果发现一个金额不正确,您修复该金额,您就完成了;无需查找冗余副本或重新计算依赖值。@kgrittn:同样的想法,可能是因为这是避免冗余存储的明显途径。:)