Impala实现group_concat分组排序拼接

首先,先声明:常见数据库Oracle、Mysql、MSsql等,是支持group_concat中使用order by的,但是Impala是不支持group_concat中使用order by的(百度了、想尽办法折腾了)

因为业务上强烈要求进行数据排序,所以我也是绞尽脑汁,最后找到了解决方法:拒绝order by,牺牲一点性能,采用 row_number + concat_ws + group_concat,可以达到预期效果

实现步骤:

1、先完成聚合前的数据筛选,完成数据过滤

2、开窗,row_number进行数据排序,添加序号,并cast转为字符串;

3、多字段组合,concat_ws进行聚合字段和序号字段的拼接,并replace掉序号为空串(concat_ws只支持字符串)

4、单字段聚合,group_concat进行最后的数据拼接

5、输出结果,检查完即为预期结果,perfect!

注意:在步骤2中,如果不用row_number,只用order by排序,最后结果集还是会回到原始顺序,无法完成排序聚合

如下演示一段示例,大家可以自行复制到本机运行,检查运行结果进行验证

with sou as (
select '1' code union all
select '3' code union all
select '4' code union all
select '2' code union all
select '5' code ),

dea as (select code,cast(row_number() over(order by code) as string) rowid from sou),

res as (select group_concat(concat_ws('',code,replace(rowid,rowid,''))) codes from dea)

select * from res

-- 输出结果:
-- 1, 2, 3, 4, 5

如上,通过上述实现步骤,就可以实现Impala的分组排序拼接;

上述逻辑显然会牺牲一点查询效率,所以如果是业务强烈要求、或者数据量不会太大的话,才建议这么处理

以上就是实现Impala分组后字符串按顺序拼接的方法,希望能帮助到大家;如果大家有其他方法在impala中进行group_concat的排序拼接,欢迎评论,共同学习

你可能感兴趣的:(Impala,数据库,Impala,sql,字符串拼接,分组拼接)