Подход и решение проблемы с таблицей лидеров соревнований 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 и найдите прекрасную работу