我有一个帖子表,每个帖子都有一个 insight 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 }
]
},
...
]
我想计算reach 和viral 的总和,然后按总数排序。
期望的结果
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)作为总数
,但大多数情况下我得到的错误是列不存在。
到目前为止,这是我的 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;
最佳答案
不确定 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)
关于sql - 计算 PostgreSQL 9.5 中两列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37840516/