Как получить количество людей, которые имеют лучшую зарплату, чем текущий кортеж - PullRequest
1 голос
/ 14 марта 2020

Я работал над проблемой из Leetcode # 185

Я мог бы понять решение, но я хочу знать, как написать запрос, который добавляет столбец, который указывает количество людей иметь лучшую зарплату, чем кортеж. Я думаю, что это возможно в SQL, но я не знаю, как это сделать правильно, я всегда получаю синтаксическую ошибку. : - /

from Employee e1 (Select count(distinct e2.Salary)
                  from Employee e2
                  Where e2.Salary > e1.Salary) as c

Например, у меня есть такая таблица. Сотрудник:

Id - Name - Salary
1    toto   60000
2    tata   50000
3    kiki   90000
4    lily   70000
5    momo   60000

Я хочу получить такой результат:

Id - Name - Salary - Head_count_of_higher_salary
1    toto   60000      2
2    tata   50000      4
3    kiki   90000      0
4    lily   70000      1
5    momo   60000      2

Спасибо, ребята

Ответы [ 3 ]

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

Вы также можете реализовать этот тип запроса с LEFT JOIN для объединенной таблицы, имеющей более высокую зарплату, чем первая, и затем подсчитать количество строк в объединенной таблице:

SELECT e1.Id, e1.Name, e1.Salary, COUNT(e2.Id) AS Head_count_of_higher_salary
FROM Employee e1
LEFT JOIN Employee e2 ON e2.Salary > e1.Salary
GROUP BY e1.Id, e1.Name, e1.Salary

Выходные данные :

Id  Name    Salary  Head_count_of_higher_salary
1   toto    60000   2
2   tata    50000   4
3   kiki    90000   0
4   lily    70000   1
5   momo    60000   2

Демонстрация по SQLfiddle

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

Если вы используете MySQL 8.0: вы запрашиваете именно то, что делает rank().

Это будет так просто:

select e.*, rank() over(order by salary desc) - 1 head_count_of_higher_salary
from employees e
2 голосов
/ 14 марта 2020

Ваш подзапрос почти правильный. Просто удалите DISTINCT из COUNT() (хотя просто COUNT(*) также будет работать) и используйте его в качестве нового столбца:

select *,  
  (
    select count(e2.Salary)
    from Employee e2
    where e2.Salary > e1.Salary
  ) as Head_count_of_higher_salary
from Employee e1  

См. Демонстрационную версию .

...