2014-03-25 50 views
2

我在PostgreSQL 9.3表中有數百萬行,並且我正在努力計算彙總統計信息。如何計算Postgres JSON數組中整體的百分比?

這裏是列:

object_id | date | column_with_json_data_in_key-value_format | bunch_of_irrelevant_columns

沒有爲每個OBJECT_ID /日期組合一行。 JSON列中有大約70個鍵,但是任何給定的行只包含〜5-20個鍵。

在所有的object_id的,針對每一個琴鍵,什麼是日平均分數值?

  1. 在每一行,計算所有值的總和爲所有按鍵劃分爲特定行
  2. 如果密鑰不會出現在一排,把它當作具有特定鍵值0該行
  3. 組的值的結果按日期
  4. 計算平均值爲每個鍵

所以我的期望輸出與下列的表:

date | key1_name | key1_fractional_average | keyN_name | keyN_fractional_average

我想這個查詢單行,但它不能正常工作:

SELECT value2, total, (value2/total * 100) AS percent FROM 
    (SELECT SUM(value) AS total FROM 
     (SELECT CAST(CAST(value AS text) AS integer) FROM json_each((SELECT json_column 
      FROM original_table 
      WHERE primary_key = 1)::json)) as table1) as total_table, 
    (SELECT CAST(CAST(value AS text) AS integer) AS value2 FROM json_each((SELECT json_column 
      FROM original_table 
      WHERE primary_key = 1)::json)) as value_table 

對於這個特殊的PAGE_ID/insight_date行,查詢返回如下:

value2 | total | percent 
------------------------ 
1;   4;   0 
2;   4;   0 
1;   4;   0 

value2total是正確的,但percent列錯誤顯示爲0的,而不是心病直接25%,50%,25%。

不幸的是,因爲JSON是一個相當新的類型的Postgres,google搜索並沒有止跌回升的例子很多。我在這裏完全困惑。

+0

問題不在於JSON是一種新類型。問題在於它不能替代[數據庫規範化](http://en.wikipedia.org/wiki/Database_normalization)。 –

+0

謝謝,但在這種情況下,這些JSON值遠遠好於JSON。我提到JSON是一種新的類型,因爲它使我永遠想到要將它轉換爲整數,我首先必須將其轉換爲文本。將它們標準化爲單獨的表格將是一場噩夢,因爲有許多JSON列,並且很少訪問它們。這些特定的查詢只能用於深度分析,所以只要我能夠首先找出這個查詢結構,性能下降就沒有問題。 –

回答

6

你正在分割整數,它給你整數除法和丟棄餘數。您需要將它們轉換爲分數類型。

value2::double precision/total::double precision * 100 

您可能想在查詢中進行更深入的轉換。