AWS Redshift 列“view_table_B.cost”必须出现在 GROUP BY 子句中或用于聚合函数

Posted

技术标签:

【中文标题】AWS Redshift 列“view_table_B.cost”必须出现在 GROUP BY 子句中或用于聚合函数【英文标题】:AWS Redshift column "view_table_B.cost" must appear in the GROUP BY clause or be used in an aggregate function 【发布时间】:2020-09-20 14:06:48 【问题描述】:

我在 AWS Redshift 中有 2 个查询,这些查询针对具有相似架构的不同表。但我的问题是其中一个查询正在运行,而另一个查询失败。

第一次查询

SELECT view_table_A.accountId, view_table_A.date, SUM(view_table_A.cost) as Cost 
FROM view_table_A
GROUP BY accountId, date
HAVING Cost >= '20'

第二次查询

SELECT view_table_B.projectname, view_table_B.usagedate, sum(view_table_B.cost) as Cost 
FROM view_table_B 
GROUP BY projectname, usagedate 
HAVING Cost >= '20'

我的问题是第一个查询运行良好,而第二个查询将返回如下错误

亚马逊无效操作:列“view_table_B .cost”必须出现在 GROUP BY 子句中或用于聚合函数中;

更新 1 我尝试从查询中删除 ' 但仍然得到相同的结果。我附上了我尝试在 redshift 中执行的查询的屏幕截图。

【问题讨论】:

。 .您没有正确转录查询。如果一个有效,另一个也应该有效。注意:20 周围的单引号不正确。比较值应该是数字,而不是字符串。 @GordonLinoff,感谢您的回复。我试图删除查询中的单引号,但仍然得到相同的结果。当我执行这两个查询时,我还会附上屏幕截图。 【参考方案1】:

Redshift 标识符不区分大小写,因此 costCost 在您的查询中会发生冲突。

我能够重现该问题:

with src(cost, dat) as (
    select 1, current_date
    union all
    select 2, current_date
)
SELECT
 dat,
 sum(s.cost) as Cost
FROM src s
GROUP BY dat
HAVING Cost = 3
;

它给了我

[2020-06-04 11:22:44] [42803][500310] Amazon 无效操作:列“s.cost”必须出现在 GROUP BY 子句中或用于聚合函数中;

如果您将该列重命名为不同的名称,则可以修复查询:

with src(cost, dat) as (
    select 1, current_date
    union all
    select 2, current_date
)
SELECT
 dat,
 sum(s.cost) as sum_cost
FROM src s
GROUP BY dat
HAVING sum_cost = 3
;

我还惊讶地发现用" 引用标识符并没有解决问题 - 正如我最初预期的那样。

【讨论】:

以上是关于AWS Redshift 列“view_table_B.cost”必须出现在 GROUP BY 子句中或用于聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用更改表查询在 AWS Redshift 中添加多列

AWS:从 dynamodb 到 redshift 的数据转换 [关闭]

如何在 python 中定义正在写入 AWS Redshift Postgres DB 的数据的列类型

AWS Redshift 中的表格太大了

我可以使用 AWS Glue 将 S3 上的 json 数据转换为列格式并将其推送到 Redshift 吗?

AWS Redshift 列“view_table_B.cost”必须出现在 GROUP BY 子句中或用于聚合函数