Workato中基于Apache DataFusion的SQL逗号分隔列表实现问题
解决Apache DataFusion(Workato)中值列表扁平化为逗号分隔字符串的问题
核心问题分析
你之前用array_agg+array_to_string加row_number()去重的方式丢数据,本质是没正确做分组聚合,导致聚合范围错误,后续去重时误删了包含有效数据的行。另外DataFusion里不用绕弯子转数组,直接用专门的字符串聚合函数更可靠。
可行解决方案
DataFusion支持list_agg聚合函数,直接实现“将分组内的列值去重后拼接成逗号分隔字符串”的需求,无需额外处理数组或去重行。
正确SQL写法示例
假设你的表名为your_table,需要按key_value分组,将三个列分别扁平化为逗号分隔字符串:
SELECT key_value, list_agg(DISTINCT FlatColumn1, ',') AS flattened_col1, list_agg(DISTINCT FlatColumn2, ',') AS flattened_col2, list_agg(DISTINCT FlatColumn3, ',') AS flattened_col3 FROM your_table GROUP BY key_value;
为什么原来的方法会丢数据
- 没有指定
GROUP BY key_value时,array_agg会基于全局或默认窗口聚合,导致同一个key_value对应多行不同的聚合结果; - 用
row_number()去重时,只会保留其中一行,其他行的有效聚合值就被丢弃了。
注意事项
- 确保
GROUP BY子句包含所有非聚合列(这里就是key_value),保证每个分组的聚合逻辑正确; list_agg的第二个参数是分隔符,可根据需求替换为其他字符(如分号);- 若不需要去重,去掉
DISTINCT关键字即可。
内容的提问来源于stack exchange,提问作者Ischade
相关产品推荐
相关产品推荐

