разделы и сортировки строк, поэтому данные будут обработаны за один проход по
таблице.
SELECT airport_name, city, timezone, latitude,
first_value( latitude )
OVER tz AS first_in_timezone,
latitude - first_value( latitude ) OVER tz AS delta,
rank()
OVER tz
FROM airports
WHERE timezone IN ( 'Asia/Irkutsk', 'Asia/Krasnoyarsk' )
WINDOW tz AS ( PARTITION BY timezone ORDER BY latitude DESC )
ORDER BY timezone, rank;
...
--[ RECORD 5 ]-----+-----------------
airport_name
| Байкал
city
| Улан-Удэ
timezone
| Asia/Irkutsk
latitude
| 51.807764
first_in_timezone | 58.135
delta
| -6.327236
rank
| 5
--[ RECORD 6 ]-----+-----------------
airport_name
| Норильск
city
| Норильск
timezone
| Asia/Krasnoyarsk
latitude
| 69.311053
first_in_timezone | 69.311053
delta
| 0
rank
| 1
...
Более подробно использование оконных функций описано в документации. Мы ре-
комендуем начать с раздела 3.5 «Оконные функции», в котором приводятся приме-
ры их использования. В разделе 9.21 «Оконные функции» приводятся описания всех
оконных функций, предлагаемых PostgreSQL. В разделе 4.2.8 «Вызовы оконных функ-
ций» детально рассматривается синтаксис вызова оконных функций. В разделе 7.2.5
«Обработка оконных функций» говорится о том, на каком этапе выполнения запроса
производится обработка этих функций.
175
Глава 6. Запросы
6.4. Подзапросы
Прежде чем приступить к рассмотрению столь сложной темы, как подзапросы, опи-
шем, как в общем случае работает команда SELECT. Согласно описанию этой коман-
ды, приведенному в документации, дело, в несколько упрощенном виде, обстоит так.
1. Сначала вычисляются все элементы, приведенные в списке после ключевого
слова FROM. Под такими элементами подразумеваются не только реальные таб-
лицы, но также и виртуальные таблицы, создаваемые с помощью ключевого
слова VALUES. Если таблиц больше одной, то формируется декартово произве-
дение из множеств их строк. Например, в случае двух таблиц будут сформиро-
ваны попарные комбинации каждой строки из одной таблицы с каждой строкой
из другой таблицы. При этом в комбинированных строках сохраняются все ат-
рибуты из каждой исходной таблицы.
2. Если в команде присутствует условие WHERE, то из полученного декартова про-
изведения исключаются строки, которые этому условию не соответствуют. Та-
ким образом, первоначальное множество строк, сформированное без всяких
условий, сужается.
3. Если присутствует предложение GROUP BY, то результирующие строки группи-
руются на основе совпадения значений одного или нескольких атрибутов, а за-
тем вычисляются значения агрегатных функций. Если присутствует предложе-
ние HAVING, то оно отфильтровывает результирующие строки (группы), не удо-
влетворяющие критерию.
4. Ключевое слово SELECT присутствует всегда. Но в списке выражений, идущих
после него, могут быть не только простые имена атрибутов, но и их комбина-
ции, созданные с использованием арифметических и других операций, а также
вызовы функций. Причем эти функции могут быть не только встроенные, но
и созданные пользователем. В списке выражений не обязаны присутствовать
все
атрибуты, представленные в строках используемых таблиц. Например, ат-
рибуты, на основе которых формируются условия в предложении WHERE, могут
отсутствовать в списке выражений после ключевого слова SELECT. Предложе-
ние SELECT DISTINCT удаляет дубликаты строк.
5. Если присутствует предложение ORDER BY, то результирующие строки сорти-
руются на основе значений одного или нескольких атрибутов. По умолчанию
сортировка производится по возрастанию значений.
6. Если присутствует предложение LIMIT или OFFSET, то возвращается только
подмножество строк из выборки.
176
6.4. Подзапросы
Приведенная схема описывает работу команды SELECT на логическом уровне, а на
уровне реализации запросов в дело вступает планировщик, который и формирует
план выполнения запроса.
А теперь перейдем непосредственно к теме этого раздела — подзапросам.
Предположим, что сотрудникам аналитического отдела потребовалось провести ста-
тистическое исследование финансовых результатов работы авиакомпании. В каче-
стве первого шага они решили подсчитать количество операций бронирования, в ко-
торых общая сумма превышает среднюю величину по всей выборке.
Достарыңызбен бөлісу: |