Сгруппируйте строки по department_id и в HAVING требуйте, чтобы число подходящих строк совпадало с общим числом. Тогда женщины, низкие оценки и NULL исключат департамент.
Получение департаментов, где только мужчины оценили выше пяти
Сгруппируйте строки по department_id и в HAVING требуйте, чтобы число подходящих строк совпадало с общим числом. Тогда женщины, низкие оценки и NULL исключат департамент.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеется таблица evaluations. Не используя JOIN‑ов и вложенных запросов, необходимо вывести все идентификаторы департаментов, в которых присутствуют только мужчины‑респонденты и каждый из них поставил оценку строго больше 5.
evaluations.sql
create table evaluations
(
respondent_id uuid primary key, -- ID респондента
department_id uuid, -- ID департамента
gender boolean, -- true — мужчина, false — женщина
value integer
);
Ответ
Сгруппируйте строки по department_id и в HAVING требуйте, чтобы число подходящих строк совпадало с общим числом. Тогда женщины, низкие оценки и NULL исключат департамент.
SELECT department_id
FROM evaluations
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING COUNT(*) = SUM(
CASE WHEN gender IS TRUE AND value > 5 THEN 1 ELSE 0 END
);
Фильтровать gender и value в WHERE нельзя: так исчезнут неподходящие респонденты и смешанный департамент ошибочно пройдёт проверку. Пустые департаменты не представлены в evaluations и в результат не попадут. JOIN и вложенные запросы не используются.