Я пытаюсь выбрать первую и последнюю дату в окне в зависимости от месяца и года указанной даты.
Вот пример данных:
F.rates
| id | c_id | date | rate |
---------------------------------
| 1 | 1 | 01-01-1991 | 1 |
| 1 | 1 | 15-01-1991 | 0.5 |
| 1 | 1 | 30-01-1991 | 2 |
.................................
| 1 | 1 | 01-11-2014 | 1 |
| 1 | 1 | 15-11-2014 | 0.5 |
| 1 | 1 | 30-11-2014 | 2 |
Вот pgSQL SELECT, который я придумал:
SELECT c_id, first_value(date) OVER w, last_value(date) OVER w FROM F.rates
WINDOW w AS (PARTITION BY EXTRACT(YEAR FROM date), EXTRACT(MONTH FROM date), c_id
ORDER BY date ASC)
Это дает мне результат, очень близкий к тому, что я хочу:
| c_id | first_date | last_date |
----------------------------------
| 1 | 01-01-1991 | 15-01-1991 |
| 1 | 01-01-1991 | 30-01-1991 |
.................................
Должно быть:
| c_id | first_date | last_date |
----------------------------------
| 1 | 01-01-1991 | 30-01-1991 |
.................................
По некоторым причинам last_value(date)
возвращает каждую запись в окне. Это наводит меня на мысль, что я неправильно понимаю, как работают окна в SQL. Это похоже на то, как SQL формирует новое окно для каждой строки, которую он просматривает, но не для нескольких окон для всей таблицы на основе YEAR и MONTH.
Так может ли кто-нибудь быть добрым и объяснить, если я ошибаюсь, и как мне достичь желаемого результата?
Есть причина, по которой я не использую MAX / MIN по предложению GROUP BY. Следующим моим шагом будет получение связанных ставок для выбранных мной дат, например:
| c_id | first_date | last_date | first_rate | last_rate | avg rate |
-----------------------------------------------------------------------
| 1 | 01-01-1991 | 30-01-1991 | 1 | 2 | 1.1 |
.......................................................................