sql - 如何使用单独的逗号对列进行分组
Posted
技术标签:
【中文标题】sql - 如何使用单独的逗号对列进行分组【英文标题】:sql - how to group by on column with separate comma 【发布时间】:2020-06-25 09:10:54 【问题描述】:SELECT
account_id,
app_name,
triggered_signatures,
DATE,
COUNT(*) AS cnt
FROM "public"."bus_request"
WHERE DATE >= '2020-06-22' AND triggered_signatures IS NOT NULL AND triggered_signatures != ''
GROUP BY account_id, app_name, triggered_signatures, DATE
ORDER BY account_id, cnt, DATE DESC
我得到:
aaaaa uuuu 200004025 2020-06-22 1
bbbbb rrrr 200003092,200004268 2020-06-23 12
bbbbb kkkk 200004268 2020-06-23 412
如何为每个trigger_signatures 获取以逗号分隔的记录数?
我想得到:
aaaaa uuuu 200004025 2020-06-22 1
bbbbb rrrr 200004268 2020-06-23 7
bbbbb rrrr 200003092 2020-06-23 5
bbbbb kkkk 200004268 2020-06-23 412
例如
【问题讨论】:
向我们展示结果 您希望获得与在“我正在获取”部分中向我们展示数据相同的方式...triggered_signatures
是如何存储在数据库中的?
列是varchar128
你能显示bus_request
表的截图吗?并且请不要忘记在评论中提及,以便我们收到通知
@HelloWorld - 表格太大...无法截屏...
【参考方案1】:
您基本上需要unnest 值数组。在 redshift 中没有很好的方法 - 您必须将表与索引表交叉连接,然后查找每个元素的索引。
这与此处描述的取消嵌套 json 数组 https://***.com/a/30198745/1680826 的问题相同,但您应该使用 REGEXP_COUNT(triggered_signatures, ',')
来获取数组长度,而不是使用 JSON_EXTRACT_
函数,并使用 SPLIT_PART(triggered_signatures, ',', index)
获取数组元素。
希望对你有帮助。
查询示例:
with input (account_id, app_name, triggered_signatures, date, cnt) as (
select 'aaaaa', 'uuuu', '200004025', '2020-06-22', 1
union all
select 'bbbbb', 'rrrr', '200003092,200004268', '2020-06-23', 12
union all
select 'bbbbb', 'kkkk', '200004268', '2020-06-23', 412
), sequence (index) as (
select 1 union all
select 2 union all
select 3 union all
select 4
)
select
account_id,
app_name,
split_part(triggered_signatures, ',', index) as triggered_signautres,
date,
cnt
from input cross join sequence
where regexp_count(triggered_signatures, ',') + 1 >= index
;
【讨论】:
split_part(triggered_signatures,',',1) 如你所说已修复。以上是关于sql - 如何使用单独的逗号对列进行分组的主要内容,如果未能解决你的问题,请参考以下文章