【发布时间】: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 }
]
},
...
]
我想要计算出 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) 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