我在 PostgreSQL 9.3 表中有几百万行,我正在努力计算聚合统计数据。
这是列:
object_id |日期 | column_with_json_data_in_key-value_format | bunch_of_irrelevant_columns
每个 object_id/date 组合都有一行。 JSON 列中大约有 70 个键,但任何给定行仅包含 ~5-20 个键。
在所有 object_id 中,对于每个键,每日平均分数值是多少?
- 在每一行中,计算特定键的值除以该特定行的所有键的所有值的总和
- 如果某个键没有出现在一行中,则将其视为该行的值为 0
- 按日期对结果进行分组
- 计算每个键的平均值
所以我想要的输出是一个包含以下列的表格:
日期 | key1_name | key1_fractional_average |键名 | 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 中是一种相当新的类型,谷歌搜索并没有找到很多例子。我在这里很困惑。
最佳答案
您正在对整数进行除法,这会为您提供整数除法并舍弃余数。您需要将它们转换为小数类型。
value2::double precision/total::double precision * 100
您可能希望在查询的更下方进行转换。
关于json - 如何计算 Postgres JSON 数组中的整体百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22643468/