Генерация row_number () с разделом, используя только самостоятельные объединения в SQL - PullRequest
1 голос
/ 07 июня 2019

Мы все используем ROW_NUMBER () OVER (Порядок сортировки по столбцу1 по столбцу2), когда мы пытаемся упорядочить строки на основе столбца раздела.Вот у меня вопрос -

Учитывая таблицу Employee с двумя столбцами (Emp_id, Salary).Как вернуть первые 10 строк (упорядоченные по зарплате) из этой таблицы, не используя ничего из следующего.

rank, cte, подзапросы, top, limit, генераторы, order by, переменные, определяемые пользователем или встроенные функции или встроенные функции базы данных.

Вот ссылка SQL Fiddle http://www.sqlfiddle.com/#!18/22ab9/10

Единственный способ заставить это работать до некоторой степени - использовать самообъединение и использовать «наличие» для фильтрации первых 10 рангов.Однако я не могу генерировать номера строк.Если есть связь, я присваиваю тот же ранг участвующей строке, в результате чего возвращаются неправильные первые 10 строк.

- Вот то, что я написал

select e1.Emp_id, e1.Salary, count(distinct e2.salary) rnk
from
  Employee e1
  join
  Employee e2 on e1.Salary <= e2.Salary
group by
  e1.Emp_id, e1.salary
having count(distinct e2.salary)<= 10

- Вот как я ожидаю, что оно будет вести себя

select *
from
(
select e1.Emp_Id, e1.Salary, ROW_NUMBER() OVER (Order by Salary desc) rnk
from Employee e1
) a where rnk <= 10

Как мне справляться со связями в себеприсоединиться и все еще иметь возможность назначить ему другой ранг / номер строки?

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Вы можете использовать два сравнения.Предполагая, что emp_id уникален:

select e1.Emp_id, e1.Salary, count(distinct e2.salary) as rnk
from Employee e1 join
     Employee e2
     on e1.Salary < e2.Salary or
        (e1.Salary = e2.Salary and e1.emp_id <= e.emp_id)
group by e1.Emp_id, e1.salary
having count(distinct e2.salary) <= 10
0 голосов
/ 07 июня 2019

Исходя из ответа Гордона, я думаю, что это сработало для меня.

select e1.Emp_id, e1.Salary, count(*) as rnk
from Employee e1 join
     Employee e2
     on e1.Salary < e2.Salary  or
        (e1.Salary = e2.Salary and e1.emp_id <= e2.emp_id)
group by e1.Emp_id, e1.salary
having count(*) <= 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...