Presto SQL中Unnest操作如何限制仅展开100条e_id数据?
如何在Presto的UNNEST操作中限制仅展开100个e_id值
当然可以限制,这里提供两种实用的实现方式:
方法一:截断数组后再执行UNNEST
直接使用Presto的slice函数截取数组e的前100个元素,再进行UNNEST,这样展开的元素数量最多为100(数组长度不足100时则保留全部)。修改后的final部分SQL如下:
final as ( SELECT f_id, e_id FROM req f CROSS JOIN UNNEST(slice(e, 1, 100)) AS t(e_id) )
slice(e, 1, 100)的参数含义:第一个参数是目标数组,第二个是起始位置(Presto数组索引从1开始),第三个是截取的最大元素数。
方法二:UNNEST后通过窗口函数过滤
先正常执行UNNEST展开所有元素,再用row_number()窗口函数按f_id分组编号,最后筛选出编号≤100的记录。这种方式适合需要先对展开元素排序再截取的场景,修改后的SQL如下:
final as ( SELECT f_id, e_id FROM ( SELECT f_id, e_id, row_number() over(partition by f_id order by e_id) as rn FROM req f CROSS JOIN UNNEST(e) AS t(e_id) ) sub WHERE rn <= 100 )
你可以根据需求调整order by e_id的排序逻辑,如果不需要特定顺序,也可以改为order by 1或者省略(不同Presto版本对无排序的窗口函数支持可能有差异,建议显式指定排序规则)。
内容的提问来源于stack exchange,提问作者Pratibha UR
相关产品推荐
相关产品推荐

