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