БЛОК 1. ВОПРОСЫ Для самопроверки Postgresql
Тема 1. Базовый синтаксис
Напишите запрос, который выводит список клиентов (CompanyName) и общее количество их заказов. Отсортируйте по убыванию количества заказов.
Выведите список заказов (OrderID, OrderDate, CustomerID) за 1997 год, отсортированный по дате от новых к старым.
Найдите 5 сотрудников (Employees), которые обработали больше всего заказов. Выведите их имена (FirstName, LastName) и количество заказов.
Вывести список клиентов и их менеджеров (Employees), которые закреплены за ними. Если у клиента нет менеджера – показать NULL.
Найти общую сумму продаж (Quantity * UnitPrice) по каждому сотруднику за 1997 год. Вывести сотрудника и сумму.
Вывести список товаров (ProductName), цена которых > 50, но которые никогда не заказывались (нет записей в Order Details).
Вывести количество заказов по странам доставки (ShipCountry), исключив страны с количеством заказов < 10.
Тема 2. Подзапросы
Найдите товары, цена которых выше средней цены всех товаров в их категории.
Вывести список клиентов, у которых сумма всех заказов больше средней суммы заказов по всем клиентам.
Найти заказы, которые были доставлены с задержкой (ShippedDate > RequiredDate). Выведите OrderID, дату заказа, требуемую дату и фактическую дату доставки. Отсортируйте по максимальной задержке.
Вывести клиентов (CompanyName), у которых есть хотя бы один заказ с общей суммой (с учетом скидки) больше 5000$.
Найти категории, в которых количество товаров больше среднего количества товаров по всем категориям.
Тема 3. CTE (WITH … AS)
Используя CTE, посчитайте суммарную выручку по каждому месяцу 1997 года, а затем найдите месяц с максимальной выручкой.
С помощью CTE постройте витрину: клиент → сумма его заказов. Затем проранжируйте клиентов по сумме заказов и выведите топ-10.
Используя CTE, найдите клиентов, которые сделали более 5 заказов в 1997 году, и их средний чек.
Тема 4. Оконные функции
Для каждого заказа добавьте колонку с номером заказа по порядку внутри клиента (первый заказ клиента, второй и т.д.).
Для каждого товара покажите его цену и цену предыдущего товара (по алфавиту) и разницу между ними.
Для каждого клиента покажите его последний заказ (OrderID и OrderDate) и количество дней между последним и предпоследним заказом.
Проранжируйте сотрудников по общей сумме продаж, которые они принесли в 1997 году, используя RANK() и DENSE_RANK().
Для каждого заказа посчитайте накопительную сумму (кумулятивную) по дате заказа (от самых ранних к поздним).
Тема 5. Работа с датами
Вывести список заказов за последние 30 дней от текущей даты (используйте CURRENT_DATE).
Вывести количество заказов по кварталам 1997 года.
Найдите все заказы, у которых ShippedDate приходится на выходные дни (суббота или воскресенье). Используйте функцию EXTRACT или DATE_PART.
Рассчитайте среднюю продолжительность доставки (в днях) по каждому месяцу заказа (OrderDate - ShippedDate). Выведите месяц заказа и среднюю задержку.
Тема 6. Оптимизация и типы данных
Предположим, что у нас есть таблица Orders с 10 млн записей. Какой индекс вы бы создали, чтобы ускорить запрос:
SELECT * FROM Orders WHERE CustomerID = 'ALFKI' AND OrderDate BETWEEN '1997-01-01' AND '1997-12-31'?Почему в таблице Products для поля UnitPrice лучше использовать DECIMAL(10,2), а не FLOAT?
Как мы можем увидеть план выполнения запроса в PostgreSQL? Что показывает параметр «cost»?