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)
请注意,我们并不关心获取第一个值,我们只需要任何(理想的确定性)单值.
先感谢您.
| 归档时间: |
|
| 查看次数: |
5139 次 |
| 最近记录: |