sql - sql - 如何使用单独的逗号对列进行分组
问题描述
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
例如
解决方案
您基本上需要取消嵌套值数组。在 redshift 中没有很好的方法 - 您必须将表与索引表交叉连接,然后查找每个元素的索引。
这与取消嵌套此处描述的 json 数组https://stackoverflow.com/a/30198745/1680826JSON_EXTRACT_
的问题相同,但是您应该使用函数而不是函数REGEXP_COUNT(triggered_signatures, ',')
来获取数组长度并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
;
推荐阅读
- python - 通过函数进行内联更改输入参数,而不是使用类方法
- python - 错误:优化器得到一个空的参数列表
- vscode-extensions - vscode 扩展补全:如何替换原文?
- amazon-web-services - AWS 免费套餐使用限制和删除 EC2 实例
- python - 从文件中读取str包含十六进制字节str字符并解码?
- django - URL 在 localhost 上工作但不在生产环境中
- sql-server - 如何在 GitHub Actions 中连接到 Docker SQL Server
- text-to-speech - 创建文本到语音变体的最佳方法
- c++ - C++协程泄漏内存和帧
- reactjs - 反应路由器渲染组件两次