hive - 支持greenplum string_agg 转换成hivesql
问题描述
我们正在将 greenplum sql 查询迁移到 hivesql,请在下面找到可用的语句 string_agg。我们如何迁移,请帮助我们。下面是迁移配置单元所需的示例 greenplum 代码。
select string_agg(Display_String, ';' order by data_day )
select string_agg(Display_String, ';' order by data_day )
from
(
select data_day,
sum(revenue)/1000000.00 as revenue,
data_day||' '||trim(to_char(sum(revenue),'9,999,999,999')) as Display_String
from(
select case when data_date = current_date then 'D:'
when data_date = current_date - 1 then ' D-01:'
when data_date = current_date - 2 then ' D-02:'
when data_date = current_date - 7 then ' D-07:'
when data_date = current_date - 28 then ' D-28:'
end data_day, revenue/1000000.00 revenue
from test.testable
where data_date between current_date - 28 and current_date and hour <=(Select hour from ( select row_number() over(order by hour desc) iRowsID, hour from test.testable where data_date = current_date and type = 'UVC')tbl1
where irowsid = 2) and type in( 'UVC')
order by 1 desc) a
group by 1)aa;
解决方案
蜂巢中没有这样的东西。但是,您可以使用collect list
andpartition by/Order by
来计算它。
select concat_ws(';', max(concat_str))
FROM (
SELECT collect_list(Display_String) over (order by data_day ) concat_str
FROM
(your above SQL) s ) concat_qry)r
解释 -
- 收集列表连接字符串,并在执行此操作时按日期列上的订单数据排序。
- 最外层的 MAX() 将获取连接字符串的最大数据。
请注意这是一个非常缓慢的操作。在实施之前也要测试性能。
这是一个示例 SQL 和结果来帮助您。
select
id, concat_ws(';', max(concat_str))
from
( select
s.id, collect_list(s.c) over (partition by s.id order by s.c ) concat_str
from
( select 1 id,'ax' c union
select 1,'b'
union select 2,'f'
union select 2,'g'
union all select 1,'b'
union all select 1,'b' )s
) gs
group by id