SELECT airport_name, city, round( latitude::numeric, 2 ) AS ltd, timezone, rank() OVER ( PARTITION BY timezone ORDER BY latitude DESC ) FROM airports WHERE timezone IN ( 'Asia/Irkutsk', 'Asia/Krasnoyarsk' ) ORDER BY timezone, rank; В этом запросе в предложении OVER ( PARTITION BY timezone ... ) указывается,
что строки относятся к одному разделу на основе совпадения значений в столбце
timezone. Обратите внимание, что хотя в предложении OVER задан порядок сорти-
ровки, действующий в пределах каждого окна, тем не менее, с помощью предложе-
ния ORDER BY указан также и порядок сортировки на уровне всего запроса.
airport_name |
city
| ltd |
timezone
| rank
---------------+---------------+-------+------------------+------
Усть-Илимск
| Усть-Илимск
| 58.14 | Asia/Irkutsk
|
1
Усть-Кут
| Усть-Кут
| 56.85 | Asia/Irkutsk
|
2
Братск
| Братск
| 56.37 | Asia/Irkutsk
|
3
Иркутск
| Иркутск
| 52.27 | Asia/Irkutsk
|
4
Байкал
| Улан-Удэ
| 51.81 | Asia/Irkutsk
|
5
Норильск
| Норильск
| 69.31 | Asia/Krasnoyarsk |
1
Стрежевой
| Стрежевой
| 60.72 | Asia/Krasnoyarsk |
2
Богашёво
| Томск
| 56.38 | Asia/Krasnoyarsk |
3
Емельяново
| Красноярск
| 56.18 | Asia/Krasnoyarsk |
4
Абакан
| Абакан
| 53.74 | Asia/Krasnoyarsk |
5
Барнаул
| Барнаул
| 53.36 | Asia/Krasnoyarsk |
6
Горно-Алтайск | Горно-Алтайск | 51.97 | Asia/Krasnoyarsk |
7
Кызыл
| Кызыл
| 51.67 | Asia/Krasnoyarsk |
8
(13 строк)
Усложним запрос — для каждого аэропорта будем вычислять разницу между его гео-
графической широтой и широтой, на которой находится самый северный аэропорт в
этом же часовом поясе. Поскольку в запросе используются три конструкции с окон-
ными функциями и при этом способ формирования разделов и порядок сортировки
строк в разделах один и тот же, то вводится предложение WINDOW. Оно позволяет
создать определение раздела, а затем ссылаться на него при вызове оконных функ-
ций. Самый северный аэропорт в каждом часовом поясе, т. е. самая первая строка в
каждом разделе, выбирается с помощью оконной функции first_value. Строго говоря,
эта функция получает доступ к первой строке оконного кадра, а не раздела. Однако
когда используются правила формирования оконного кадра по умолчанию, тогда его
начало совпадает с началом раздела.
133
Обратите внимание, что в этом запросе в каждой конструкции OVER используется
ссылка на одно и то же окно, т. е. имеет место один и тот же порядок разбиения на