我编写了一个如下所示的 SQL 查询:
SELECT date_trunc('week', created_at)::date AS week, posted_to AS providers
FROM documents
GROUP BY week, providers
ORDER BY week, providers
典型的划船看起来像这样:
2017-05-08 {facebook_2214,facebook_2215,facebook_2216,twitter_2219}
我想计算单词
facebook
或 twitter
或 linkedin
或其他词每周出现的次数,因此本周按 facebook
分组应返回 3
和 twitter
一周应该回来1
。列类型是数组。
有什么想法吗?我宁愿它是程序化的,而不是为每个可能的结果写一个
AS facebook
,但乞丐不能是选择者。
使用
split_part()
提取提供商名称并按日期分组计数总和,提供商:
with my_data(date, providers) as (
values
('2017-05-08', '{facebook_2214,facebook_2215,facebook_2216,twitter_2219}'::text[]),
('2017-05-15', '{twitter_2220,twitter_2221,linkedin_2222}')
)
select date, provider, count(*)
from (
select date, split_part(u, '_', 1) as provider
from my_data,
unnest(providers) u
) s
group by 1, 2
order by 1, 2;
date | provider | count
------------+----------+-------
2017-05-08 | facebook | 3
2017-05-08 | twitter | 1
2017-05-15 | linkedin | 1
2017-05-15 | twitter | 2
(4 rows)