我需要运行:
select arrayagg(o_clerk)
within group (order by o_orderkey desc)
OVER (PARTITION BY o_orderkey order by o_orderkey
ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS RESULT
from sample_data
但是Snowflake返回错误Sliding window frame unsupported for function ARRAYAGG
。如果我试图在没有滑动窗口的情况下累加所有值,我会得到错误Cumulative window frame unsupported for function ARRAY_AGG
。
我如何才能做到这一点?
示例数据:
create or replace table sample_data as (
with data as (
select 1 a, [1,3,2,4,7,8,10] b
union all select 2, [1,3,2,4,7,8,10]
)
select 'Ord'||a o_orderkey, 'c'||value o_clerk, index
from data, table(flatten(b))
)
;
预期结果:
(source,用于BigQuery迁移)
4条答案
按热度按时间jjhzyzn01#
我非常喜欢Emanuel在forums上的解决方案:
(如果Emanuel想在此添加自己的答案,我将删除此处的答案)
emeijp432#
谢谢@Felipe Hoffa这里是我的解决方案最初张贴在:
https://community.snowflake.com/s/question/0D73r000006upCECAY/detail?fromEmail=1&s1oid=00Di0000000hZh2&s1nid=0DB3100000001Fq&s1uid=0050Z000009Xcck&s1ext=0&emkind=chatterCommentNotification&emtm=1669252526852
mutmk8jj3#
由于我们不能用
ARRAY_AGG()
得到这些结果,我们可以通过一个self join。首先我们给予每一行一个行号,然后选择行号和+3之间的所有行:
请注意,我必须在原来的问题中添加一个
index
字段,这样我们就可以在行中有一个明确的排序顺序。92vpleto4#
使用
ARRAY_AGG
和ARRAY_SLICE
。灵感源自Rajat's answer输出量:
start_index和num_elem计算可以被进一步简化/一般化以仿真窗口滑动帧
ROWS BETWEEN PRECEDING prec AND FOLLOWING foll
。显示用于调试的ARRAY_SLICE的每个参数: