我在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的,针对每一个琴键,什么是日平均分数值?
- 在每一行,计算所有值的总和为所有按键划分为特定行
- 如果密钥不会出现在一排,把它当作具有特定键值0该行
- 组的值的结果按日期
- 计算平均值为每个键
所以我的期望输出与下列的表:
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
列value2
和total
是正确的,但percent
列错误显示为0的,而不是心病直接25%,50%,25%。
不幸的是,因为JSON是一个相当新的类型的Postgres,google搜索并没有止跌回升的例子很多。我在这里完全困惑。
问题不在于JSON是一种新类型。问题在于它不能替代[数据库规范化](http://en.wikipedia.org/wiki/Database_normalization)。 –
谢谢,但在这种情况下,这些JSON值远远好于JSON。我提到JSON是一种新的类型,因为它使我永远想到要将它转换为整数,我首先必须将其转换为文本。将它们标准化为单独的表格将是一场噩梦,因为有许多JSON列,并且很少访问它们。这些特定的查询只能用于深度分析,所以只要我能够首先找出这个查询结构,性能下降就没有问题。 –