如何在没有ARRAY_AGG的情况下获取GROUP BY中的第一个(或任何单个)值?

Mat*_*ell 5 sql postgresql group-by aggregate-functions vertica

我迁移一些SQL和PostgreSQL 9.2至7.0 Vertica的,我可以利用一些帮助的Postgres更换的冷静ARRAY_AGG的东西,功能Vertica的(可能还有其他RDBMS)支持,如分区和窗口功能.我是这些功能的新手,我真的很感激你的想法.

使用array_agg(sql fiddle demo)的(工作)查询:

SELECT B.id, (array_agg(A.X))[1]
FROM B, AB, A
WHERE B.id = AB.B_id AND A.id = AB.A_id AND A.X IS NOT NULL
GROUP BY B.id;
Run Code Online (Sandbox Code Playgroud)

如果我试图在没有聚合的情况下天真地选择AX(即,让RDBMS选择 - 实际上与MySQL和SQLite一起工作),postgres抱怨.运行相同的查询但使用"AX"而不是"(array_agg(AX))1 ":

ERROR:  column "a.x" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT B.id, A.X
Run Code Online (Sandbox Code Playgroud)

我正在考虑尝试一个窗口函数,例如,从这个问题:

SELECT email, FIRST_VALUE(email) OVER (PARTITION BY email)
FROM questions
GROUP BY email;
Run Code Online (Sandbox Code Playgroud)

但我得到同样的错误:

SELECT B.id, FIRST_VALUE(A.X) OVER (PARTITION BY A.id)
FROM B, AB, A
WHERE B.id = AB.B_id AND A.id = AB.A_id AND A.X IS NOT NULL
GROUP BY B.id;

ERROR:  column "a.x" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT B.id AS id, FIRST_VALUE(A.X) OVER (PARTITION BY A.id)...
Run Code Online (Sandbox Code Playgroud)

请注意,我们并不关心获取第一个值,我们只需要任何(理想的确定性)单值.

先感谢您.

Mat*_*ell 1

@a_horse_with_no_name 的评论以及 Denis 的评论是我们重新思考我们的方法所需要的。我们已经切换到 MIN()。谢谢!