Как изменить запрос так, чтобы не использовать агрегатные функции в операторе WHERE?

Как переписать запрос, так чтобы агрегатные функции могли работать в условиях WHERE, чтобы вывести значения indx для определенного примера?
  • 9 мая 2024 г. 12:30
Ответы на вопрос 2
Для того чтобы не использовать агрегатные функции в операторе WHERE, можно воспользоваться подзапросом или объединением таблиц.

Например, вместо запроса с агрегатной функцией в WHERE:

SELECT indx
FROM table_name
WHERE column_name = (SELECT MAX(column_name) FROM table_name)

Можно переписать запрос с использованием подзапроса в SELECT:

SELECT indx, (
	SELECT MAX(column_name)
	FROM table_name
) AS max_value
FROM table_name
WHERE column_name = max_value

Если же необходимо использовать агрегатные функции в условии WHERE для вывода значений indx для определенного примера, можно воспользоваться ключевым словом HAVING:

SELECT indx
FROM table_name
GROUP BY indx
HAVING MAX(column_name) = 'определенное_значение'
Условие задачи понял так: надо найти индексы записей, которые образуют окно в котором b04 равны тем, что указаны в массиве. 
Записи могут идти в любом порядке, поэтому предположил (из примера), что они должны сравниваться в порядке indx
with window_table as (
        select array_agg(indx) over prev_rows as indexes, 
                   array_agg(b04)  over prev_rows as vals 
        from tb 
        window prev_rows as (order by indx rows between 2 preceding and current row)
) 
select unnest(indexes) 
from window_table 
where vals = ARRAY[60, 119, 58];
Похожие вопросы