SQL:分割字符串并按周计算出现次数

问题描述 投票:0回答:1

我编写了一个如下所示的 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
,但乞丐不能是选择者。

sql arrays postgresql aggregate-functions
1个回答
4
投票

使用

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)    
© www.soinside.com 2019 - 2024. All rights reserved.