Вот утренний вызов: у вас есть таблица с такими строками:
=> select * from candidates;
id | name
----+----------
1 | JOhn Doe
2 | Melinda
3 | Bill
4 | Jane
(4 rows)
=> select * from evaluation order by id;
id | score | reason
----+-------+--------------------------------------
1 | RED | Clueless!
1 | AMBER | Came in dirty jeans
2 | GREEN | Competenet and experienced
2 | AMBER | Was chewing a gum
3 | AMBER | No experience in the industry sector
3 | AMBER | Has knowledge gaps
(6 rows)
У Джона красный, у Мелинды зеленый и янтарный, у Билла только янтарный, а у Джейн еще не давали интервью.
Ваша миссия, если вы решите принять ее, это сгенерировать запрос, который отображает результаты для одобрения босса. Босс любит, чтобы результаты были представлены как:
- Если у кандидата ЗЕЛЕНЫЙ, отобразите только зеленый и игнорируйте красные и янтарные цвета.
- Если у кандидата есть красные и янтарные или только янтарные цвета, отобразите их все, но сначала появится красный счет, чтобы он мог пропустить янтарь, если КРАСНЫЙ действительно плох.
- отображать СЕРЫЙ для всех кандидатов, которые еще не были опрошены («Джейн»)
Правила игры:
- Нет функций! Должен быть один SQL-запрос (сколько угодно подзапросов)
- Любой вариант SQL принят, но ANSI SQL 92 или более поздняя версия приносит вам больше очков
- Старайтесь избегать встроенных переменных, если можете (@foo в MySQL)
Мой собственный ответ соответствовал групповому мышлению:
SELECT *
FROM evaluation e1
NATURAL JOIN candidates
WHERE score = 'GREEN'
OR ( score IN ( 'RED', 'AMBER' )
AND NOT EXISTS (SELECT 1
FROM evaluation e2
WHERE e1.id = e2.id
AND score = 'GREEN') )
UNION
SELECT id,
'GREY' AS score,
'Not yet evaluated' AS reason,
name
FROM candidates
WHERE id NOT IN (SELECT id
FROM evaluation)
ORDER BY 1,
2 DESC