Jef*_*man 2 postgresql json aggregate-functions
我在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
Run Code Online (Sandbox Code Playgroud)
对于此特定的page_id/insight_date行,查询将返回以下内容:
value2 | total | percent
------------------------
1; 4; 0
2; 4; 0
1; 4; 0
Run Code Online (Sandbox Code Playgroud)
列value2和total是正确的,但percent列错误显示为0的,而不是正确的25%,50%,25%.
不幸的是,因为JSON在Postgres中是一个相当新的类型,谷歌搜索并没有出现很多例子.我在这里完全糊涂了.
你正在划分整数,它给你整数除法并丢弃余数.您需要将它们转换为小数类型.
value2::double precision/total::double precision * 100
Run Code Online (Sandbox Code Playgroud)
您可能希望在查询中进一步向下执行.