问题描述
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) )