2014-03-25 45 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 

您可能想在查询中进行更深入的转换。