как получить первое (или любое отдельное) значение в группе BY без массива AGG?
Я переношу некоторые SQL из PostgreSQL 9.2 в Vertica 7.0, и я мог бы использовать некоторую помощь, заменив классную функцию postgres array_agg чем-то, что поддерживает Vertica (и, возможно, другие СУБД), такие как разделы и оконные функции. Я новичок в этих функциях, и я был бы очень признателен за ваши идеи.
(рабочий) запрос с использованием 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;
Если я попытаюсь наивно выбрать A. X сам по себе без агрегация (то есть, чтобы позволить СУБД выбирать - фактически работает с MySQL и SQLite), жалуется postgres. Запуск того же запроса, но с "A. X" вместо "(array_agg(A. X))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
Я думал попробовать оконную функцию, например, что-то вроде из этого вопроса:
SELECT email, FIRST_VALUE(email) OVER (PARTITION BY email)
FROM questions
GROUP BY email;
Но я получаю ту же ошибку:
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)...
Обратите внимание, что нас не так сильно заботит получение первого значения, нам просто нужно любое (идеально детерминированное) единственное значение.
Спасибо вы заранее.