2012-05-10 38 views
0

我有一个表格,其中有2列,列出了我们产品的每个版本中特定项目的数量。我需要计算两列之间的百分比增加量并将其附加到表中的新列,但是我还没有找到任何与此相关的文档?我使用的是Postgres 9.0,我需要检查两个列之间的百分比增加,作为QC过程的一部分,以确保发行版之间不存在缺失/错误数据。计算2列之间的百分比变化

这里的表定义:

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) 

我想补充一个增长百分比列,并填充它与正确的百分比。

+2

1121,1122 - 那些是字段名称或值?请在这里发布完整的表格定义。并告诉我们你到目前为止做了什么。 – vyegorov

+1

似乎应该有一个释放表,每个版本有*一个*金额,以及一个计算所有/选定版本之间变化的视图/函数。 **不** **表之间的增量之间的版本。此外,请提及您的Postgres版本和计算的预期目的(以更好地了解您需要的内容)。 –

回答

0

我会说,这将增加百分比列是一个时间的操作,可以这样做(details in the docs):

ALTER TABLE target ADD pct float; 

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

UPDATE target SET pct = (after::float - before::float)/before::float; 
+0

正是我所需要的,非常感谢! –

3

认为这是你真正需要的:

表看起来应该是李柯本:

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 1; 

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 
+0

这只是*完全*我在提出答案之前正在考虑的建议!没有多余的金额存储,所以如果发现一个金额不正确,您就修复了一笔金额,然后就完成了;没有必要寻找冗余副本或重新计算相关值。 – kgrittn

+0

@kgrittn:同样的想法,可能是因为它是避免冗余存储的明显途径。 :) –