聚合子查询的 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 子句的嵌套表的主要内容,如果未能解决你的问题,请参考以下文章

具有不相等相关谓词的不支持的聚合子查询

MySQL的子查询中FROM和EXISTS子句的使用教程

如何提高其 SET 涉及昂贵的聚合子查询的 SQL UPDATE 语句的性能?

在 Core Data 中聚合子节点

Psql - from 子句中的子查询 - 不好的做法?

mysql中的五子查询