Для двух и более передач используйте GROUP BY/HAVING, для отсутствующих — NOT EXISTS, для последней передачи — выбор первой строки после сортировки по времени и ID.
-- Напишите запрос, который возвращает каналы, у которых >= 2 телепередач
Для двух и более передач используйте GROUP BY/HAVING, для отсутствующих — NOT EXISTS, для последней передачи — выбор первой строки после сортировки по времени и ID.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
-- Напишите запрос, который возвращает каналы, у которых >= 2 телепередач
-- Напишите запрос, который возвращает каналы, у которых 0 телепередач
-- Напишите запрос, который выводит для каждого телеканала -- его имя и его последнюю программу в базе
Ответ
Для двух и более передач используйте GROUP BY/HAVING, для отсутствующих — NOT EXISTS, для последней передачи — выбор первой строки после сортировки по времени и ID.
Схема не указана. Предположим PostgreSQL и таблицы channels(id, name), programs(id, channel_id, name, starts_at). «Последняя» означает максимальное время начала.
SELECT c.id, c.name
FROM channels c JOIN programs p ON p.channel_id = c.id
GROUP BY c.id, c.name HAVING count(*) >= 2;
SELECT c.* FROM channels c
WHERE NOT EXISTS (
SELECT 1 FROM programs p WHERE p.channel_id = c.id
);
SELECT c.name, p.name AS last_program
FROM channels c
LEFT JOIN LATERAL (
SELECT name FROM programs
WHERE channel_id = c.id
ORDER BY starts_at DESC NULLS LAST, id DESC
LIMIT 1
) p ON true;
Последний запрос сохраняет каналы без программ с NULL. Если требуется последняя уже вышедшая передача, добавьте ограничение по текущему времени.