🔗 Разбираем вторую часть тестового задания в Т-Банк
Перед нами схема из 5 таблиц: сотрудники, звонки, клиенты, системы и история позиций.
1.1. Список всех сотрудников по алфавиту Здесь проверяется база: выбор всех полей и сортировка
SELECT * FROM Employees ORDER BY last_nm, first_nm, middle_nm;
1.2. Сотрудники и их позиции на конкретную дату (10.10.2020) Тут важно правильно сджойнить историю должностей и отфильтровать актуальный срез времени
SELECT e.last_nm, e.first_nm, e.middle_nm, jh.position_nm FROM Employees e JOIN Job_history jh ON e.position_id = jh.position_id WHERE '2020-10-10' BETWEEN jh.valid_from_dttm AND jh.valid_to_dttm;
1.3. Список сотрудников с ЗП от 20к до 50к на текущий момент Используем фильтрацию по диапазону и техническую дату 9999-12-31 (или текущий момент), чтобы найти актуальные записи в истории
SELECT e.last_nm, e.first_nm, e.middle_nm, jh.salary, e.hire_dt FROM Employees e JOIN Job_history jh ON e.position_id = jh.position_id WHERE jh.salary BETWEEN 20000 AND 50000 AND jh.valid_to_dttm >= CURRENT_DATE; -- Или 9999-12-31 в зависимости от логики БД
1.4. Форматирование ФИО в один столбец через дефис Задача на конкатенацию строк. В разных СУБД синтаксис может отличаться (|| или CONCAT), используем стандартный
SELECT last_nm || '-' || first_nmask: Полноеmiddle_nm AS fio, birth_dt FROM Employees;
1.5. Количество звонков по дням с 01.10.2020 по сегодня Группировка и агрегация — «хлеб» аналитика. Приводим timestamp к формату даты
SELECT CAST(start_dttm AS DATE) AS call_date, COUNT(call_id) AS cnt_calls FROM Calls WHERE start_dttm >= '2020-10-01' GROUP BY 1 ORDER BY 1;
😮💨 Есть вопросы по логике джойнов? Пишите в комментариях, обсудим