Подход и решение проблемы с таблицей лидеров соревнований HackerRank с помощью SQL
Если вы хотите улучшить свои навыки SQL или успешно пройти следующее техническое собеседование, все, что вам нужно сделать, это попрактиковаться. HackerRank (как и другие платформы) предлагает сотни таких задач, и в сегодняшней статье я собираюсь обсудить, как подходить и решать задачу в таблице лидеров конкурса.
Проблема «Таблица лидеров соревнований» на HackerRank
Теперь давайте перейдем непосредственно к определению проблемы.
Вы проделали такую большую работу, помогая Джулии с ее последним соревнованием по программированию, что она хочет, чтобы вы тоже поработали над этим!
Общий балл хакера — это сумма его максимальных баллов за все испытания. Напишите запрос для вывода hacker_id, имени и общей оценки хакеров в порядке убывания. Если несколько хакеров набрали одинаковый общий балл, отсортируйте результат по возрастанию hacker_id. Исключите всех хакеров с общим счетом из вашего результата.
HackerRank также предоставил пример ввода, состоящий из двух таблиц, hackers
и submissions
:
-- Hackers table +-----------+---------+ | hacker_id | name | +-----------+---------+ | 4071 | Rose | | 4806 | Angela | | 26071 | Frank | | 49438 | Patrick | | 74842 | Lisa | | 80305 | Kimberly| | 84072 | Bonnie | | 87868 | Michael | | 92118 | Todd | | 95895 | Joe | +-----------+---------+ -- Submissions table +---------------+-----------+--------------+-------+ | submission_id | hacker_id | challenge_id | score | +---------------+-----------+--------------+-------+ | 67194 | 74842 | 63132 | 76 | | 64479 | 74842 | 19797 | 98 | | 40742 | 26071 | 49593 | 20 | | 17513 | 4806 | 49593 | 32 | | 69846 | 80305 | 19797 | 19 | | 41002 | 26071 | 89343 | 36 | | 52826 | 49438 | 49593 | 9 | | 31093 | 26071 | 19797 | 2 | | 81614 | 84072 | 49593 | 100 | | 44829 | 26071 | 89343 | 17 | | 75147 | 80305 | 49593 | 48 | | 14115 | 4806 | 49593 | 76 | | 6943 | 4071 | 19797 | 95 | | 12855 | 4806 | 25917 | 13 | | 73343 | 80305 | 49593 | 42 | | 84264 | 84072 | 63132 | 0 | | 9951 | 4071 | 49593 | 43 | | 45104 | 49438 | 25917 | 34 | | 53795 | 74842 | 19797 | 5 | | 26363 | 26071 | 19797 | 29 | | 10063 | 4071 | 49593 | 96 | +---------------+-----------+--------------+-------+
Решение
Теперь определение проблемы требует, чтобы мы написали запрос, который
- получает идентификатор хакера, имя и общий балл, набранный в задачах, отправленных каждым хакером. Если пользователь представил несколько решений для одной задачи, следует рассматривать решение с максимальным баллом.
- взломы с нулевой оценкой должны быть исключены из окончательного набора результатов
- результаты должны быть отсортированы по сумме полученных баллов
В качестве первого шага мы можем вычислить максимальное количество баллов, набранное хакером и вызовом, чтобы отфильтровать любые другие заявки с более низкими баллами.
SELECT h.hacker_id, h.name, s.challenge_id, MAX(score) max_score FROM hackers h INNER JOIN submissions s ON h.hacker_id = s.hacker_id GROUP BY h.hacker_id, h.name, s.challenge_id
Теперь все, что нам нужно сделать, это добавить дополнительное предложение SELECT
к результату приведенного выше запроса, чтобы суммировать максимальные баллы за задачи, выполненные учащимися, и исключить те, которые имеют 0 баллов.
SELECT hacker_id, name, SUM(max_score) FROM ( SELECT h.hacker_id, h.name, s.challenge_id, MAX(score) max_score FROM hackers h INNER JOIN submissions s ON h.hacker_id = s.hacker_id GROUP BY h.hacker_id, h.name, s.challenge_id ) x GROUP BY 1, 2 HAVING SUM(max_score) <> 0 ORDER BY 3 DESC, 1
Последние мысли
В этом коротком уроке мы решили SQL-упражнение Contest Leadership на HackerRank. Я надеюсь, что решение было легко следовать. И.. продолжайте практиковаться!
👉 Стань участником и читай все истории на Medium. Ваш членский взнос напрямую поддерживает меня и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.
👇Похожие статьи, которые вам также могут понравиться👇
Повышение уровня кодирования
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Хлопайте за историю и подписывайтесь на автора 👉
- 📰 Смотрите больше контента в публикации Level Up Coding
- 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
- 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"
🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу