Есть ли способ упростить этот запрос Basi c Join? - PullRequest
0 голосов
/ 06 августа 2020

Я новичок в SQL, и я делал несколько упражнений в Интернете, чтобы улучшить свои навыки запросов.

Я пытался решить эту проблему: https://www.hackerrank.com/challenges/contest-leaderboard/problem

Мне удалось решить эту проблему с помощью приведенного ниже кода, но мне было интересно, есть ли способ упростить / сделать его более эффективным?

SELECT
    id,
    name,
    total_score
FROM(
SELECT
    id,
    name,
    SUM(sscore) as total_score
FROM(
SELECT
    id,
    name,
    challenge_id,
    MAX(score) as sscore
FROM(
SELECT
    hacker_id as id,
    name,
    submission_id,
    challenge_id,
    score
FROM
    Hackers
INNER JOIN
    Submissions s USING(hacker_id)
ORDER BY
    hacker_id,
    challenge_id)a
GROUP BY id, name, challenge_id)b
GROUP BY id, name
ORDER BY total_score DESC, id ASC)c
WHERE total_score > 0;

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Вам нужно только соединение, а не два или три. Для управления значениями 0 вы можете использовать предложение HAVING.

введите описание изображения здесь

SELECT a.hacker_id,a.name, SUM(a.mscore) from (
        SELECT h.hacker_id,h.name, max(score) as mscore from Submissions s inner join hackers h on h.hacker_id=s.hacker_id group by h.hacker_id, challenge_id,h.name
    ) as a group by a.hacker_id,a.name
HAVING SUM(a.mscore) > 0
ORDER BY 3 DESC,
1 ASC
0 голосов
/ 06 августа 2020

Вот то, что я пробовал, и оно успешно отправлено.

SELECT b.hacker_id, b.name , c.total_score from (
SELECT a.hacker_id as hid, SUM(a.max_score) as total_score from (
        SELECT hacker_id, max(score) as max_score from Submissions group by hacker_id, challenge_id
    ) as a group by a.hacker_id
) as c INNER JOIN Hackers b
ON b.hacker_id = c.hid
WHERE c.total_score > 0
ORDER BY c.total_score DESC,
b.hacker_id ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...