почему я должен использовать группу здесь? - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь решить эту проблему в leetcode: https://leetcode.com/problems/rank-scores/, и у меня есть два решения (mysql). Оба работают.

select a.Score as Score,
(select count(distinct b.Score) from Scores as b where b.Score>=a.score) as Rank
from Scores as a
order by a.Score desc;

и

select s1.Score,count(distinct(s2.score)) Rank
from
Scores s1,Scores s2
where
s1.score<=s2.score
group by s1.Id
order by Rank

Но я не уверен, почему я должен использовать GROUP BY во втором решении, чтобы убедиться, что sql вычисляет счет для каждого счета (или он возвращает только минимальный балл), но мне не нужно использовать его в первом решении.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Но я не уверен, почему я должен использовать GROUP BY во втором решении, чтобы убедиться, что sql вычисляет счет для каждой оценки

Второй запрос работает самостоятельно присоединение к таблице при условии неравенства: для каждой строки с псевдонимом s1 вы получаете все строки в s2, которые имеют меньшую или равную оценку. Затем вам нужно агрегировать, чтобы вы могли посчитать, сколько s2 строк имеется для каждого s1, что дает вам рейтинг.

Примечание: если вы используете MySQL 8.0, вы можете сделать это без объединения или подзапроса, используя оконную функцию rank(), которая делает именно то, что вы хотите:

 select score, rank() over(order by score desc) rn from scores

Наконец, начиная с 2020 года, вы должны использовать явные , стандартные соединения, а не старые школы, неявные соединения:

select s1.score, count(distinct(s2.score)) rn
from scores s1
inner join scores s2 on s1.score <= s2.score
group by s1.id, s1.score
order by rn
2 голосов
/ 17 марта 2020

Каждый столбец, который не является частью функции агрегации и находится в предложении select, должен быть добавлен в группу с помощью предложения

Так, например:

Нужно сгруппировать по:

select col1, col2, count(*) -- count is aggregate function
from table_name
group by col1, col2

Или

Не нужно группировать по:

select count(*) -- count is aggregate function
from table_name

Вот небольшой пример, чтобы увидеть, как это работает: нажмите ЗДЕСЬ


Сказав, что ваш второй запрос не работает: это код, который работает (без ошибок):

select s1.Score
       , count(distinct(s2.score)) `Rank`
from Scores s1
join Scores s2 on s2.Score >= s1.score
group by s1.Score, s1.id
order by `Rank`;

Вот демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...