Хорошо, изначально это была просто шутка, которую мы имели с моим другом, но это оказалось интересным техническим вопросом:)
У меня есть следующая таблица stuff
:
CREATE TABLE stuff
(
id serial PRIMARY KEY,
volume integer NOT NULL DEFAULT 0,
priority smallint NOT NULL DEFAULT 0,
);
В таблице содержатся записи для всех моих материалов с соответствующим объемом и приоритетом (насколько мне это нужно).
У меня есть сумка с указанным объемом, скажем 1000
. Я хочу выбрать из таблицы все, что я могу положить в сумку, сначала упаковывая самые важные вещи.
Это похоже на случай использования оконных функций, поэтому вот запрос, который я придумал:
select s.*, sum(volume) OVER previous_rows as total
from stuff s
where total < 1000
WINDOW previous_rows as
(ORDER BY priority desc ROWS between UNBOUNDED PRECEDING and CURRENT ROW)
order by priority desc
Проблема с этим, однако, заключается в том, что Postgres жалуется:
ERROR: column "total" does not exist
LINE 3: where total < 1000
Если я удалю этот фильтр, итоговый столбец будет правильно рассчитан, результаты будут правильно отсортированы, но все элементы будут выбраны, а это не то, что я хочу.
Итак, как мне это сделать? Как выбрать только элементы, которые могут помещаться в сумку?