Я пытаюсь понять, что функции окна PostgreSQL (9.3) немного лучше. Предположим, у меня есть простая таблица, как:Как выполнить отфильтрованный запрос в окне окна PostgreSQL?
SimpleTable
id int,
tservice timestamp
и хотите:
Select id, tservice , count(*) OVER (PARTITION BY id ....) as counter
from SimpleTable
, где записи в SimpleTable имеют TService раз уходящие 40 лет, но счетчик должен быть ограничен только за три года до отметки времени tcervice каждой записи.
Как я могу произвести подсчет для каждой записи в SimpleTable?
Следствие вопрос: Как бы тот же запрос можно изменить, чтобы добавить количество всех записей, которые произошли за три года до сегодняшнего дня?
Edit # 1: Теперь я вижу, где этот вопрос является расплывчатым (я узнал что-то :)). Используя ответ ниже, я хотел бы получить отсчитывать 3yrs и отсчет от текущей даты, что-то вроде:
3yrs prior current date
1, 100, '2001-01-01 00:00:00', 0 0
2, 100, '2002-01-01 00:00:00', 1 0
3, 100, '2003-01-01 00:00:00', 2 0
4, 100, '2004-01-01 00:00:00', 3 0
5, 100, '2005-01-01 00:00:00', 3 0
6, 100, '2006-01-01 00:00:00', 3 0
7, 100, '2007-01-01 00:00:00', 3 0
8, 100, '2008-01-01 00:00:00', 3 0
9, 100, '2009-01-01 00:00:00', 3 0
10, 100, '2010-01-01 00:00:00',3 0
11, 100, '2011-01-01 00:00:00',3 0
12, 100, '2012-01-01 00:00:00',3 0
13, 100, '2013-01-01 00:00:00',3 0
14, 100, '2014-01-01 00:00:00',3 1
15, 100, '2015-01-01 00:00:00',3 2
16, 100, '2016-01-01 00:00:00',3 3 (today is 2016-01-06)
Edit # 2: Это работает, чтобы получить ответ, что нужно, но не использовать оконный раздел. Я думаю, что PostgreSQL не реализует RANGE
с интервалами - вот что я думаю, что эта проблема требует.
select s1.recid, s1.tservice, s1.client_recid,
(select count(*) from simpletable s2
where (s1.tservice - s2.tservice)::INTERVAL <= interval '3 years' and
s2.tservice < s1.tservice and
s2.client_recid = s1.client_recid)
from simpletable s1
order by client_recid, tservice
На пару сотен тысяч записей это занимает около 10 секунд на моем ноутбуке. Есть ли более быстрый способ?
Добавление Примечание: Использование функционального подхода с курсором очерченного Эрвин сократило время выполнения до 146ms. Спасибо всем за отличный учебник.
Что касается COUNT «за три года до обслуживания каждой записи», вы можете предоставить «данные образца» и «ожидаемый результат», пожалуйста, –