Необходимо понять решение этого запроса - PullRequest
0 голосов
/ 29 мая 2020

Мы определяем общий заработок сотрудника как его ежемесячный труд, а максимальный общий заработок - как максимальный общий заработок для любого сотрудника в таблице «Сотрудник». Напишите запрос, чтобы найти максимальный общий заработок для всех сотрудников, а также общее количество сотрудников, у которых есть максимальный общий заработок. Затем выведите эти значения как целые числа, разделенные пробелами. Это ссылка на вопрос для лучшего понимания https://www.hackerrank.com/challenges/earnings-of-employees/problem

Я новичок в SQL и не могу понять решение, которое было дано

1.SELECT (months*salary) as earnings,
 2.COUNT(*) FROM Employee
3. GROUP BY earnings
4. ORDER BY earnings DESC
 5.LIMIT 1;

Я понял первый шаг, когда мы даем месячную зарплату * Псевдоним, который является заработком, на 2-м шаге мы считаем нет. сотрудников из таблицы сотрудников. Я не понимал, почему мы используем group by здесь, 4-й и 5-й шаги также понятны, мы использовали предложение order by для ранжирования доходов от самого высокого до самого низкого, а ограничение 1 принесет мне наивысшее значение. Но почему ГРУППА? Игнорировать 1,2,3,4,5. Это просто числа, которые я использовал для большей ясности

Ответы [ 4 ]

1 голос
/ 29 мая 2020

GROUP BY объединяет ваши результаты. Когда есть несколько чисел "заработка" с одинаковым значением, в вашей таблице будет только одно число.

1 голос
/ 29 мая 2020

Вы ошибочно разбили запрос.

Должно быть:

SELECT (months*salary) as earnings, -- 2 and 4
       COUNT(*)                     -- 4
FROM Employee                       -- 1
GROUP BY earnings                   -- 3
ORDER BY earnings DESC              -- 5
LIMIT 1;                            -- 6

Шаг 1 - таблица Employee используется как источник данных

Шаг 2 - вычисляется значение выражения (months*salary) для каждой записи в таблице

Шаг 3 - записи, которые имеют то же значение выражения из (2), обрабатываются как группа

Шаг 4 - для каждой группы значение выражения из (2) помещается в выходной буфер, а количество записей в группе вычисляется и добавляется в выходной буфер

Шаг 5 - строки в выходном буфере отсортировано по выражению из (2) в порядке убывания

Шаг 6 - возвращается первая строка из буфера (т.е. которая имеет наибольшее значение выражения из (2)).

1 голос
/ 29 мая 2020

Шаг 3: GROUP BY earnings было использовано для ГРУППЫ ВМЕСТЕ с одинаковым доходом. Если у вас есть, например, доход в 3000 долларов, а их было 3, они будут сгруппированы вместе. GROUP BY также требуется в сочетании с агрегатной функцией COUNT(*). В противном случае COUNT(*) не будет работать и вернет ошибку.

Шаг 4: ORDER BY earnings DESC было использовано для упорядочивания СГРУППИРОВАННЫХ ЗАРАБОТОК в порядке убывания. Это означает, от НАИБОЛЬШОГО ЗАРАБОТКИ до САМОЙ НИЗКОЙ ЗАРАБОТКИ.

Шаг 5: LIMIT 1 ограничивает количество возвращаемых строк только 1.

Надеюсь, это поможет! :)

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

Попробуйте этот запрос:

SELECT months*salary,COUNT(*) FROM Employee GROUP BY months*salary having count(*) = 7 ORDER BY months*salary DESC;
...