SYNTAX_ERROR:'“ xyz”'必须是一个聚合表达式或出现在GROUP BY子句中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SYNTAX_ERROR:'“ xyz”'必须是一个聚合表达式或出现在GROUP BY子句中相关的知识,希望对你有一定的参考价值。
我有两个表main_table和staging_table,main_table包含原始数据,而staging_table包含一些我必须与main_table数据一起添加的更新记录,为此,我使用的是唯一ID-PersonID和到达时间-date下面是我可以执行到SQL中的查询
SELECT PersonID, LastName, FirstName, Address, City, max(date)
from
(
select PersonID, LastName, FirstName, Address, City, date from main_table
UNION
select PersonID, LastName, FirstName, Address, City, date from staging_table
) as t
GROUP by t.PersonID;
但是在执行到AWS Athena时,出现以下错误,SYNTAX_ERROR:'“ LastName”'必须为聚合表达式或出现在GROUP BY子句中
答案
我怀疑其他列可能会有所不同,您实际上想要的是最近日期的完整记录。在这种情况下,请使用row_number()
:
select p.*
from (select p.*,
row_number() over (partition by personid order by date desc) as seqnum
from ((select PersonID, LastName, FirstName, Address, City, date
from main_table
) union all
(select PersonID, LastName, FirstName, Address, City, date
from staging_table
)
) p
) p
where seqnum = 1;
此PersonId
选择具有最新日期的一行。列来自最新行。
另一答案
您必须这样分组:
SELECT PersonID, LastName, FirstName, Address, City, max(date)
from
(
select PersonID, LastName, FirstName, Address, City, date from main_table
UNION
select PersonID, LastName, FirstName, Address, City, date from staging_table
) as t
GROUP by PersonID, LastName, FirstName, Address, City;
select子句中不属于聚合函数的每一列都必须位于order by子句中。
或者您可以这样做:
SELECT PersonID, max(LastName), max(FirstName), max(Address), max(City), max(date)
from
(
select PersonID, LastName, FirstName, Address, City, date from main_table
UNION
select PersonID, LastName, FirstName, Address, City, date from staging_table
) as t
GROUP by PersonID, LastName, FirstName, Address, City;
而且还有很多其他方式可以根据您需要的结果来编写代码。这个答案是对您的问题的答案:
SYNTAX_ERROR:'“ xyz”'必须是聚合表达式或出现在GROUP BY子句
以上是关于SYNTAX_ERROR:'“ xyz”'必须是一个聚合表达式或出现在GROUP BY子句中的主要内容,如果未能解决你的问题,请参考以下文章
已知s='(XYZ)+',t='(X+Z)*Y',利用联接,求子串和转换等基本运算,将s转化为t
何时类型不是类型?错误:'是一种类型,在给定的上下文中无效'