#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