[Перевод] 10 задач для собеседования по SQL-запросам

На собеседованиях часто задают вопросы, направленные на оценку способности кандидата работать с данными, писать эффективные запросы и решать сложные и необычные задачи. Поэтому важно хорошо разбираться в SQL и уметь демонстрировать свои навыки в составлении запросов.

В этой статье мы рассмотрим 10 задач, касающихся SQL-запросов, которые часто встречаются на собеседованиях. Ознакомившись с этими задачами и их решениями, вы будете лучше готовы к тому, чтобы продемонстрировать свои навыки работы с SQL и успешно справитесь с будущими собеседованиями.

1. Рассчитайте процентный вклад каждого магазина в общий объём продаж

SELECT stor_id, SUM(qty) AS total_qty, (SUM(qty) / (SELECT SUM(qty) FROM sales) * 100) AS percentage
FROM sales
GROUP BY stor_id
ORDER BY SUM(qty) DESC;

Процентный вклад каждого магазина в общий объём продаж

Процентный вклад каждого магазина в общий объём продаж

2. Найдите второй по стоимости заказ в таблице

Эту задачу можно решить с использованием операторов LIMIT и OFFSET или с помощью подзапроса.

Обратите внимание:

  • LIMIT обозначает число строк, которые будут возвращены в наборе результатов

  • OFFSET обозначает количество строк, которые будут пропущены в наборе результатов

-- Использование LIMIT OFFSET

SELECT order_id, price
FROM order_items
ORDER BY price DESC
LIMIT 1 OFFSET 1; 


-- Использование подзапроса

SELECT MAX(price)
FROM order_items
WHERE price < (SELECT MAX(price) FROM order_items);

Второй заказ по стоимости в таблице

Второй заказ по стоимости в таблице

-- Найти вторую по величине зарплату в таблице

 SELECT MAX(salary) AS SecondHighestSalary
 FROM Employee
 WHERE salary < (SELECT MAX(salary) FROM Employee);

3. Рассчитайте объём продаж для каждого магазина, учитывая только заказы за 1993 год

-- OPTION 1

SELECT stor_id, SUM(CASE WHEN YEAR(ord_date) = 1993 THEN qty ELSE 0 END) AS total_sales
FROM sales
GROUP BY stor_id;

Объём продаж каждого магазина в 1993 году

Объём продаж каждого магазина в 1993 году

-- OPTION 2

SELECT stor_id, SUM(qty)
FROM sales
WHERE YEAR(ord_date) = 1993
GROUP BY stor_id;

Магазины, которые совершили продажи в 1993 году, а также количество продаж

Магазины, которые совершили продажи в 1993 году, а также количество продаж

4. Рассчитайте объём экспорта и импорта для каждой компании

Обратите внимание: экспорт — это когда компания является продавцом, а импорт — когда компания является покупателем.

SELECT country,
SUM(CASE WHEN companies.name = trades.seller THEN trades.value ELSE 0 END) AS export,
SUM(CASE WHEN companies.name = trades.buyer THEN trades.value ELSE 0 END) AS import
FROM companies
LEFT JOIN trades ON companies.name = trades.seller OR companies.name = trades.buyer
GROUP BY companies.country
ORDER BY companies.country ASC;

Объём экспорта и импорта для каждой компании

Объём экспорта и импорта для каждой компании

5. Определите месяц с наибольшим числом заказов в прошлом году

Обратите внимание: DATE_ADD () и DATE_SUB () выполняют операции сложения или вычитания со значениями даты. Например,  DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH) демонстрирует 3 месяца до текущей даты.

SELECT MONTH(ord_date), SUM(qty)
FROM sales
WHERE ord_date >= DATE_SUB(ord_date, INTERVAL 1 YEAR)
GROUP BY MONTH(ord_date)
ORDER BY SUM(qty) DESC
LIMIT 1;

Месяц с наибольшим числом заказов в прошлом году

Месяц с наибольшим числом заказов в прошлом году

6. Найдите книги, которые не были выпущены в последние шесть месяцев

SELECT title, MONTH(pubdate), pubdate
FROM titles
WHERE pubdate IN (
    SELECT pubdate
    FROM titles
    WHERE pubdate < DATE_SUB(CURRENT_DATE, INTERVAL 6 MONTH)
);

Книги, которые не были выпущены в последние шесть месяцев

Книги, которые не были выпущены в последние шесть месяцев

7. Рассчитайте накопленную сумму в столбце «количество» в таблице

SELECT qty, SUM(qty) OVER (ORDER BY qty) AS cumulative_sum
FROM sales;

Накопленная сумма в столбце «количество»

Накопленная сумма в столбце «количество»

8. Получите дату последнего заказа для каждого магазина

SELECT stor_id, MAX(ord_date) AS most_recent_order
FROM sales
GROUP BY stor_id
ORDER BY most_recent_order DESC;

Дата последнего заказа для каждого магазина

Дата последнего заказа для каждого магазина

9. Рассчитайте среднюю сумму заказа для каждого месяца в 1993 году

SELECT MONTH(ord_date) AS month, AVG(qty)
FROM sales
WHERE YEAR(ord_date) = 1993
GROUP BY month
ORDER BY AVG(qty) DESC;

Средняя сумма заказа для каждого месяца в 1993 году

Средняя сумма заказа для каждого месяца в 1993 году

10. Найдите магазины, которые продали как минимум 3 товара в мае 1993 года

SELECT stor_id, SUM(qty)
FROM sales
WHERE MONTH(ord_date) = '05' AND YEAR(ord_date) = 1993
GROUP BY stor_id
ORDER BY SUM(qty) DESC;

Магазины, которые продали как минимум 3 товара в мае 1993 года

Магазины, которые продали как минимум 3 товара в мае 1993 года

Еще с десяток статей с вопросами на собеседовании вы можете прочесть у нас на сайте в Рубрике «Собеседования»

Всем удачного поиска работы и хорошего дня!!!

© Habrahabr.ru