Redshift SQL中Split_part无法获取完整数据的问题求助
拆分逗号分隔字段并统计每个元素的出现次数
你现在的问题是原SQL仅能提取triggered_signatures中的第一个值,要实现预期的统计,需要把逗号分隔的字符串拆分成独立行后再分组计算。针对PostgreSQL环境(从你的表结构和函数使用判断),可以通过数组转换+行展开的方式解决:
修正后的SQL语句
SELECT b.account_id, b.app_name, unnest(string_to_array(b.triggered_signatures, ',')) AS triggered_signatures, COUNT(DISTINCT b.event_id) AS cnt FROM "public"."bus_request" b WHERE b.date > CURRENT_DATE - 2 AND b.date < CURRENT_DATE - 1 GROUP BY b.account_id, b.app_name, triggered_signatures ORDER BY b.account_id, b.app_name, triggered_signatures;
核心逻辑解释
string_to_array(b.triggered_signatures, ','):把逗号分隔的字符串转为PostgreSQL数组,比如'111,222,333'会变成['111','222','333']unnest(...):将数组的每个元素拆分为单独的行,原来的1条数据会被拆分为N行(N等于签名的数量),每一行对应一个独立签名- 最后按
account_id、app_name和拆分后的单个签名分组,用COUNT(DISTINCT b.event_id)统计每个组合的独立事件数,和你原需求保持一致
用你提供的示例数据测试,这个SQL会输出完全符合预期的结果:
account_id app_name triggered_signatures cnt
aaaa bbbb 111 2
aaaa bbbb 222 2
aaaa bbbb 333 1
aaaa bbbb 444 1
yyyy xxxx 111 2
yyyy xxxx 222 2
yyyy xxxx 444 1
yyyy xxxx 555 1
注:我把Getdate()换成了PostgreSQL标准的CURRENT_DATE,如果你的数据库环境(比如SQL Server)确实支持Getdate(),可以换回原写法。
内容的提问来源于stack exchange,提问作者meitale
相关产品推荐
相关产品推荐

