Выбирать строку в таблице SQL только в том случае, если значение находится в следующих нескольких строках таблицы?

#sql #postgresql #count #where-clause #window-functions

#sql #postgresql #количество #where-предложение #окно-функции

Вопрос:

Как мне выбрать строки из таблицы SQL с определенным значением столбца, но только если одно из двух определенных значений столбца находятся в следующих пяти строках?

Например, у меня есть таблица, которая выглядит следующим образом:

 id | name     | action 
-----------------------
 1 | New York |  1 
 2 | Boston   |  3
 3 | Dallas   |  2
 4 | Boston   |  4
 5 | New York |  2
 6 | Chicago  |  5
 7 | Dallas   |  6
  

Я хочу выбрать строки, где action=1, тогда и только тогда, когда в следующих пяти строках таблицы есть строка, где action = 4 или action = 6. В приведенной выше таблице это вернет первую строку (id = 1, Нью-Йорк) только из-за id строки = 4 (Бостон, действие = 4), но не из-за id строки = 7 (Даллас, действие = 6)

Ответ №1:

Использовать оконные функции:

 select *
from (
    select t.*,
        count(*) filter(where action in (4, 6)) over(order by id rows between 1 following and 5 following) cnt
    from mytable t
) t
where action = 1 and cnt > 0
  

Ответ №2:

Один метод использует функции окна:

 select t.*
from (select t.*,
             count(*) filter (where action in (4, 6)) over (order by id rows between current row and 5 following) as cnt_action_4_6
      from t
     ) t
where action = 1 and cnt_action_4_6 > 0