将Hive查询转换为Snowflake

问题描述

我们想更改以下查询以与SNowflake一起使用。

INSERT OVERWRITE INTO {events_scoring}.profile_to_json_with_classified_campaigns_results
SELECT to_json.ksname,to_json.cust_profile_id,concat("{{",concat_ws('$',sort_array(collect_list(concat($$"$$,cast(to_json.portfolio_type AS STRING),$$":"$$,cast(to_json.counter AS STRING),$$"$$)))),'}}') AS json_of_campaign_counters_according_to_portfolio_types
FROM
  (SELECT final.ksname,final.cust_profile_id,final.portfolio_type_final AS portfolio_type,count(*) AS counter
   FROM {events_scoring}.campaign_to_portfolio_type FINAL
   GROUP BY final.ksname,final.portfolio_type_final
            ORDER BY portfolio_type) to_json
GROUP BY to_json.ksname,to_json.cust_profile_id

提到"\""已被$$"$$取代。

但是我没有找到合适的替代sort_array函数

有人可以帮忙吗?

解决方法

您是否尝试过使用ARRAY_AGG而不是collect_list?

https://docs.snowflake.com/en/sql-reference/functions/array_agg.html

类似的东西(因此它也会对数组进行排序):

select array_agg(X) within group (order by X asc) from your_table;
,

listagg聚合函数返回用定界符连接的字符串,类似于concat_ws。可以与group by或over()一起使用。

select listagg(concat($$"$$,cast(to_json.portfolio_type AS STRING),$$":"$$,cast(to_json.counter AS STRING),$$"$$),"$") within group (ORDER BY cast(to_json.portfolio_type AS STRING),cast(to_json.counter AS STRING) )