WHERE max_sum < ( SELECT max( total_amount ) FROM bookings ) Теперь давайте скомбинируем рекурсивное общее табличное выражение с выборкой
из таблицы bookings:
WITH RECURSIVE ranges ( min_sum, max_sum ) AS ( VALUES( 0, 100000 ) UNION ALL SELECT min_sum + 100000, max_sum + 100000 FROM ranges WHERE max_sum < ( SELECT max( total_amount ) FROM bookings ) ) SELECT r.min_sum, r.max_sum, count( b.* ) FROM bookings b RIGHT OUTER JOIN ranges r ON b.total_amount >= r.min_sum AND b.total_amount < r.max_sum GROUP BY r.min_sum, r.max_sum ORDER BY r.min_sum; 188
6.4. Подзапросы min_sum | max_sum | count
---------+---------+--------
0 | 100000 | 198314
100000 | 200000 | 46943
200000 | 300000 | 11916
300000 | 400000 |
3260
400000 | 500000 |
1357
500000 | 600000 |
681
600000 | 700000 |
222
700000 | 800000 |
55
800000 | 900000 |
24
900000 | 1000000 |
11
1000000 | 1100000 |
4
1100000 | 1200000 |
0
1200000 | 1300000 |
1
(13 строк)
Обратите внимание, что для диапазона от 1 100 до 1 200 тысяч рублей значение числа
бронирований равно нулю. Для того чтобы была выведена строка с нулевым значе-
нием столбца count, мы использовали внешнее соединение.
В заключение рассмотрим команду для создания материализованного представле-
ния «Маршруты» (routes), которое было описано в главе 5. Но тогда мы не стали
рассматривать эту команду, т. к. еще не ознакомились с подзапросами, которые в ней
используются.
Описание атрибута Имя атрибута Тип PostgreSQL Номер рейса
flight_no
char(6)
Код аэропорта отправления
departure_airport
char(3)
Название аэропорта отправления
departure_airport_name
text
Город отправления
departure_city
text
Код аэропорта прибытия
arrival_airport
char(3)
Название аэропорта прибытия
arrival_airport_name
text
Город прибытия
arrival_city
text
Код самолета, IATA
aircraft_code
char(3)
Продолжительность полета
duration
interval
Дни недели, когда выполняются рейсы
days_of_week
integer[ ]
189