SQL优化:通过窗口函数实现字符串的累加

问题说明:

表A的内容
id prodname seq
1 a 1
1 b 2
1 c 3
1 d 4
2 b 1
2 c 2
2 d 3
用户希望获得这样的结果:
id prodname seq prodnames
1 a 1 a
1 b 2 a,b
1 c 3 a,b,c
1 d 4 a,b,c,d
2 b 1 b
2 c 2 b,c
2 d 3 b,c,d
用户的SQL
select a.,group_concat(prodname)
from A a left join A b on a.id=b.id and a.seq>=b.seq
group by a.

思路就是每天记录都和seq比自己小的记录join,然后再group by聚合。
这样第1条记录有1条,第2条记录会变成2条,… 第n条记录会变成n条。
如果表小还可以,但是实际生产的表有1千多万条,而且每个ID多的有几十条记录,导致这个SQL无法跑出来。

合理使用窗口函数,可以解决这个问题。

优化后的SQL:

select id,prod,seq,concat_ws(’,’,collect_list(prod) over(partition by id order by seq ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW))
from haier_tmp.gqj_test_1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值