Подвыборкой на массива агг в PostgreSQL


Есть ли способ использовать значение из агрегатной функции в предложении having в Postgresql 9.2+?

Например, я хотел бы получить каждый monkey_id со 2-м по старшинству number > 123, а также второе по старшинству число. В приведенном ниже примере я хотел бы получить (monkey_id 1, число 222).

monkey_id | number
------------------
1         | 222
1         | 333
2         | 0
2         | 444

SELECT 
  monkey_id, 
  (array_agg(number ORDER BY number desc))[2] as second 
FROM monkey_numbers 
GROUP BY monkey_id
HAVING second > 123

Я получаю column "second" does not exist.

1 2

1 ответ:

Вам придется поместить это в предложение having

SELECT 
  monkey_id
FROM monkey_numbers 
GROUP BY monkey_id
HAVING array_agg(number ORDER BY number desc)[2] > 123

Объяснение состоит в том, что having будет выполняться до select, поэтому second все еще не существует в это время.