Как использовать row_number в предложении where

Я пытаюсь использовать оконные функции для получения последних n записей, следуя отсюда:

У меня есть:

select 
   id,
   blah,
   row_number () over (
     partition by blah, my_id
     order by datetime) rn,
   theme
from documents
where theme = 'cats';

И я получаю:

 id | blah | rn | theme 
----+-----+----+-------
  1 |   1 |  1 | cats
  2 |   1 |  2 | cats
  3 |   1 |  3 | cats
  4 |   1 |  4 | cats
  5 |   1 |  5 | cats
  9 |   2 |  1 | cats
  8 |   2 |  2 | cats
 11 |   3 |  1 | cats
 12 |   4 |  1 | cats
 13 |   5 |  1 | cats
 14 |   6 |  1 | cats
(11 rows)

Это здорово. Но я хочу не более 2 строк, например rn <= 2. Я представляю это как-то так:

select 
   id,
   blah,
   row_number () over (
     partition by blah, my_id
     order by datetime) rn,
   theme
from documents
where theme = 'cats' and
rn <= 2;

но я получаю:

ERROR:  column "rn" does not exist
LINE 15: rn <= 1;
         ^

Я знаю, что могу сделать это подзапросом, как связанный вопрос, но должен быть синтаксис, который мне не хватает для помещения row_number в предложение where, верно? Что это?


person Mittenchops    schedule 03.05.2020    source источник


Ответы (1)


Вам нужна производная таблица:

select id, blah, them
from (
  select id,
         blah,
         row_number () over (partition by blah, my_id order by datetime) rn,
         theme
  from documents
) x
where theme = 'cats' 
and rn <= 2;

Это в основном синтаксический сахар и не вызывает накладных расходов на производительность.

person a_horse_with_no_name    schedule 03.05.2020
comment
Есть ли разница в производительности, если мои предложения where находятся во внутреннем выборе по сравнению с внешним? - person Mittenchops; 04.05.2020