Я работал над вопросом HackerRank SQL, "Задачи" .
Вот в чем проблема:
Джулия попросила своих учеников создать некоторые проблемы с кодированием.Напишите запрос, чтобы напечатать hacker_id, name и общее количество заданий, созданных каждым учеником.Сортируйте свои результаты по общему количеству испытаний в порядке убывания.Если более одного студента создали одинаковое количество заданий, отсортируйте результат по hacker_id.Если более одного ученика создали одинаковое количество заданий, а их число меньше максимального числа созданных заданий, исключите этих учеников из результата.
Этот вопрос поставил меня в тупик, и я искалонлайн, чтобы увидеть, как другие люди решили это, когда я столкнулся с этим Github здесь , который предложил действительно изящное решение.
SELECT c.hacker_id,
h.name,
COUNT(c.challenge_id) AS cnt
FROM Hackers AS h
JOIN Challenges AS c ON h.hacker_id = c.hacker_id
GROUP BY c.hacker_id, h.name
HAVING cnt = (SELECT COUNT(c1.challenge_id)
FROM Challenges AS c1
GROUP BY c1.hacker_id
ORDER BY COUNT(*) DESC
LIMIT 1)
OR
cnt NOT IN (SELECT COUNT(c2.challenge_id)
FROM Challenges AS c2
GROUP BY c2.hacker_id
HAVING c2.hacker_id <> c.hacker_id)
ORDER BY cnt DESC, c.hacker_id;
Я понимаю, как плакат гарантировал, что мытолько получить максимальное количество испытаний в первом условии ХАЙВИНГА, но что касается второй части, я не совсем понимаю.Я не уверен, почему работает второе условие запроса HAVING: HAVING c2.hacker_id <> c.hacker_id
Не всегда ли c2.hacker_id = c.hacker_id?