聚合子查询的 FROM 子句中的项目必须引用更高级别 FROM 子句的嵌套表
Posted
技术标签:
【中文标题】聚合子查询的 FROM 子句中的项目必须引用更高级别 FROM 子句的嵌套表【英文标题】:Items in the FROM clause of aggregation subqueries have to refer to nested tables of higher level FROM clauses 【发布时间】:2020-09-03 21:44:58 【问题描述】:我通过 kafka 将数据写入 AWS S3,因此可以多次写入消息。我正在使用 Spectrum Redshift 来查询它。
由于数据是嵌套的,我遇到了documentation 中解释的一些限制,但我似乎无法找到消除重复数据的方法。
我首先尝试了以下方法来使用 group by 删除重复项,然后进行我通常的聚合
with rid_of_duplicates as (
select table.field_1, table.struct_1.field_2, table.struct_1.field_3
from table
group by 1,2,3
)
select field_1 || field_2, count(field_3)
from rid_of_duplicates
group by field_1, field_2
但我收到以下错误
错误:频谱嵌套查询错误详情:---------------------------------------- -------- 错误:频谱嵌套查询错误代码:8001 上下文:聚合子查询的FROM 子句中的项目必须引用更高级别的FROM 子句的嵌套表。查询:0 位置:nested_query_rewriter.cpp:814 进程:padbmaster [pid=6630] ----------
如果我去掉子查询中的GROUP BY
,查询可以正常工作,但它的输出是错误的。
阅读docs,似乎我不应该在子查询中选择特定字段。但是由于我使用的是嵌套数据,所以我不能使用SELECT *
。
我也尝试过创建一个没有模式绑定的视图,但同样失败了。 SELECT Distinct
也不行
如果可能,我不想为此创建一个表,因为数据存储在 S3 中。此外,由于业务逻辑,count(distinct field_3) 不起作用
【问题讨论】:
【参考方案1】:我为此找到的解决方案是将会话的 json_serialization 设置为 TRUE,这样 Redshift 会将所有数据设置为 json,然后您可以像处理常规表一样对其进行处理。 Docs
SET json_serialization_enable TO true;
在我的例子中,我的数据是一个纯结构而不是一个结构数组(什么会启用use cases for neted data 中提到的连接)
【讨论】:
以上是关于聚合子查询的 FROM 子句中的项目必须引用更高级别 FROM 子句的嵌套表的主要内容,如果未能解决你的问题,请参考以下文章