Привет, меня зовут Андрей, и я хочу поделиться с вами своим опытом работы с базой данных SQL и конкретно с базой данных skyeng_db. В этом задании, которое я выполнял, мне нужно было оставить для каждого студента только его последние три занятия и рассчитать количество таких уроков для каждого уровня учителя (max_teaching_level).
Для начала, я приступил к изучению базы данных skyeng_db, чтобы понять ее структуру и связь между таблицами. Я обратил внимание на таблицы ″students″, ″lessons″ и ″teachers″, так как они содержали информацию, необходимую для выполнения задания.Чтобы получить только последние три занятия для каждого студента, я использовал подзапросы и функцию ROW_NUMBER. ROW_NUMBER присваивает каждой строке уникальный номер внутри группировки. Затем, я выбрал только строки, где номер меньше или равен 3.SQL-запрос для выполнения этой части задания выглядел так⁚
sql
SELECT student_id, teacher_id, lesson_start_time
FROM (
SELECT student_id, teacher_id, lesson_start_time, ROW_NUMBER OVER (PARTITION BY student_id ORDER BY lesson_start_time DESC) AS rn
FROM lessons
) AS sub
WHERE rn < 3;
После того, как я получил только последние три занятия для каждого студента, я перешел к расчету количества уроков для каждого уровня учителя (max_teaching_level). Для этого я использовал оператор GROUP BY и функцию COUNT. Группировка происходила по уровню учителя и считалось количество уроков.SQL-запрос для выполнения этой части задания выглядел так⁚
sql
SELECT t.max_teaching_level, COUNT(l.lesson_id) AS lesson_count
FROM lessons l
INNER JOIN teachers t ON l.teacher_id t.teacher_id
WHERE (l.student_id, l.teacher_id, l.lesson_start_time) IN (
SELECT student_id, teacher_id, lesson_start_time
FROM (
SELECT student_id, teacher_id, lesson_start_time, ROW_NUMBER OVER (PARTITION BY student_id ORDER BY lesson_start_time DESC) AS rn
FROM lessons
) AS sub
WHERE rn < 3
)
GROUP BY t.max_teaching_level;
sql
SELECT student_id, AVG(time_diff) AS average_time
FROM (
SELECT student_id, lesson_start_time ― LAG(lesson_end_time) OVER (PARTITION BY student_id ORDER BY lesson_start_time) AS time_diff
FROM lessons
) AS sub
GROUP BY student_id
ORDER BY average_time;
После выполнения этого запроса, я получил результат, состоящий из id студента и среднего времени, прошедшего между уроками для каждого студента, отсортированных по возрастанию среднего времени.