【问题标题】:calculate sum of two columns in PostgreSQL 9.5计算 PostgreSQL 9.5 中两列的总和
【发布时间】:2016-06-15 16:04:44
【问题描述】:

我有一个帖子表,每个帖子都有一个洞察 jsonb 列,其中包含类似于下面的数据示例。

数据样本(来自 Facebook,因此无法更改格式)

[
  {
    "name": "post_story_adds_unique",
    "values": [
      { "value": 93 }
    ],
  },
  {
    "name": "post_story_adds",
    "values": [
      {  "value": 100 }
    ]
  },
  {
    "name": "post_impressions_organic_unique",
    "values": [
      {  "value": 123 }
    ]
  },
  ...
]

我想要计算出 reachviral 的总和,然后按总数排序。

期望的结果

id  message                       post_created          reach   viral   total
69  This World Family dablah...   2016-05-11 18:44:16   6683    646     7329
...

到目前为止,我设法获得了结果,但我不知道如何获得两列的总和。我不知道在哪里添加另一个联接或选择对两列求和。

目前的结果

id  message                       post_created          reach   viral
69  This World Family dablah...   2016-05-11 18:44:16   6683    646
58  blah blah flip flop blah...   2016-05-22 11:00:01   4880    403
55  This is another message ...   2016-05-24 10:00:00   4417    109

我尝试了各种方法,例如在第一个 SELECT 中包含 SUM (reach + viral) as total,但大多数情况下我得到的错误是说列不存在。

这是我目前的 SQL:

SELECT
    id,
    message,
    post_created,
    obj.value->'values'->0->'value' AS reach,
    obj2.value->'values'->0->'value' AS viral
  FROM (
    SELECT
      id,
      message,
      post_created,
      insights
    FROM posts
    WHERE (
      page_id = 4 AND
      post_created >= '2016-05-01 00:00:00' AND
      post_created <= '2016-05-31 23:59:59' AND
      insights @> '[{"name":"post_impressions_organic_unique"}, {"name":"post_impressions_viral_unique"}]'
    )
  ) e1
  JOIN LATERAL jsonb_array_elements(insights) obj(value) ON obj.value->>'name' = 'post_impressions_organic_unique'
  JOIN LATERAL jsonb_array_elements(insights) obj2(value) ON obj2.value->>'name' = 'post_impressions_viral_unique'
  ORDER BY reach DESC;

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    不确定jsonb是否会产生影响,但是,将两列的值相加就像使用+一样简单

    create table foo(a integer,b integer);
    insert into foo values (3,4);
    select *, a+b as total from foo;
    
     a | b | total 
    ---+---+-------
     3 | 4 |     7
    (1 row)
    

    【讨论】:

    • 谢谢,我试过了,但在我的情况下,我返回列“reach”不存在
    • 你试过obj.value->'values'->0->'value' + obj2.value->'values'->0->'value'吗?
    • 是的 - 我收到此错误:错误:运算符不存在:未知 + jsonb 第 7 行:obj.value->'values'->0->'value' + obj2.value-> 'values'->0->... ^ 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
    • 即使 obj + obj2 或 obj.value + obj2.value 不起作用,得到同样的错误
    • 对,这是 JSONB 问题,尝试使用 ::integer 进行投射
    【解决方案2】:

    为此,您需要像这样更新您的表格:

    UPDATE yourTable SET resultsRow = firtRow + secondRow;
    

    【讨论】:

    • 谢谢,但我不想把它保存到表中,我只想运行查询。
    猜你喜欢
    • 2013-03-21
    • 2021-06-07
    • 2011-11-14
    • 1970-01-01
    • 2020-11-28
    • 2019-08-27
    • 1970-01-01
    • 2011-08-07
    • 2013-05-26
    相关资源
    最近更新 更多