我在PostgreSQL 9.3表中有几百万行,而且我很难计算汇总统计数据。
以下是专栏:
object_id | date | column_with_json_data_in_key-value_format | bunch_of_irrelevant_columns
每个object_id / date组合都有一行。 JSON列中大约有70个键,但任何给定的行只包含~5-20个键。
在所有object_id中,对于每个键,每日平均分数值是多少?
所以我想要的输出是一个包含以下列的表:
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中是一个相当新的类型,谷歌搜索并没有出现很多例子。我在这里完全糊涂了。
答案 0 :(得分:6)
你正在划分整数,它给你整数除法并丢弃余数。您需要将它们转换为小数类型。
value2::double precision/total::double precision * 100
您可能希望在查询中进一步向下投射。