json - 如何计算 Postgres JSON 数组中的整体百分比?

标签 json postgresql aggregate-functions

我在 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 中,对于每个键,每日平均分数值是多少?

  1. 在每一行中,计算特定键的值除以该特定行的所有键的所有值的总和
  2. 如果某个键没有出现在一行中,则将其视为该行的值为 0
  3. 按日期对结果进行分组
  4. 计算每个键的平均值

所以我想要的输出是一个包含以下列的表格:

日期 | 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

value2total 是正确的,但是 percent 列错误地显示了 0 而不是正确的 25%、50%、25 %.

不幸的是,因为 JSON 在 Postgres 中是一种相当新的类型,谷歌搜索并没有找到很多例子。我在这里很困惑。

最佳答案

您正在对整数进行除法,这会为您提供整数除法并舍弃余数。您需要将它们转换为小数类型。

value2::double precision/total::double precision * 100

您可能希望在查询的更下方进行转换。

关于json - 如何计算 Postgres JSON 数组中的整体百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22643468/

相关文章:

php - 如何将链接添加到数组值中?

json - 向 Postgresql 插入大量数据

sql - 使用虚拟默认列取 SQL 平均值

java - PSQL异常 : Syntax Error near at or "Entity" - Spring Boot

postgresql - Postgres - 基于列值的不同聚合

mysql - 查询得到一个值大于x时的累计时间(以秒为单位)

json - postgres 9.3 json 字符串数组到文本

php - 哪个是更好的做法?从 Jquery 响应获取 HTML

postgresql - 在两台服务器之间复制选定的 postgresql 表?

linux - 如何通过 iPKG 在 Synology 上安装 Postgres