как получить первое (или любое отдельное) значение в группе 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)...
Обратите внимание, что нас не так сильно заботит получение первого значения, нам просто нужно любое (идеально детерминированное) единственное значение.

Спасибо вы заранее.

1 5

1 ответ:

Комментарий@a_horse_with_no_name, наряду с комментарием Дениса, был тем, что нам нужно было переосмыслить наш подход. Мы переключились на MIN (). Спасибо!