先看sql :
select wm_concat(‘;’,value),tdate from (select value,tdate from tb order by value ) group by tdate
逻辑大概是将每月的value值有序的拼接为一个字符串。
问题:使用dataworks时发现即使提前将数据排好序再使用wm_concat,分组后的合并数据依然是无序的,然后网上找了很多信息,发现基本都是oracle的解决方案,然而datawork的wm_concat函数并不是窗口函数,不支持over(…) ,因此也无法解决问题。
解决方案: 于是翻了一下阿里提供的函数,发现有一个rank()的窗口函数, 于是使用rank函数在源数据上添加一列排名字段,然后再wm_concat()
修改后sql:
select wm_concat(‘;’,value) value ,tdate from (select rank() over(partition by tdate order by value ) as tsort , value,tdate from tb) group by tdate
然后发现数据顺序正常了,其实是什么原因我也很费解,只是看见有这个函数就尝试了一下,先记录一下,后续有时间研究一下原理。