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

时间:2014-03-25 18:36:52

标签: json postgresql 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中,对于每个键,每日平均分数值是多少?

  1. 在每一行中,计算特定键的值除以该特定行的所有键的所有值的总和
  2. 如果某个键未出现在某行中,请将其视为该行的值为0
  3. 按日期对结果进行分组
  4. 计算每个键的平均值
  5. 所以我想要的输出是一个包含以下列的表:

    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
    

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

    不幸的是,因为JSON在Postgres中是一个相当新的类型,谷歌搜索并没有出现很多例子。我在这里完全糊涂了。

1 个答案:

答案 0 :(得分:6)

你正在划分整数,它给你整数除法并丢弃余数。您需要将它们转换为小数类型。

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

您可能希望在查询中进一步向下投射。