2012-05-10 46 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:同樣的想法,可能是因爲它是避免冗餘存儲的明顯途徑。 :) –