получить пользователей до и после определенного пользователя с его рангом - PullRequest
0 голосов
/ 13 марта 2019

У меня есть такая таблица:

id|name|points
1|Ralph|15
2|Dave|2
3|Mourphy|180

Мне нужно получить пользователя с идентификатором x и 5 пользователями до и после него, основываясь на ранге очков:

Я могу получитьпользователь с

select *,rank() OVER (ORDER BY points DESC ) as rank from client where id = x;

Как получить других?

Спасибо

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Вы уже дали ответ внутри своего вопроса. Это будет (Sql Server style)

DECLARE @myRank int
SELECT @myRank = rank() OVER (Order BY points DESC) FROM client WHERE id = x;

Select *, rank() OVER (Order BY points DESC) as rank
FROM client 
HAVING rank between (@myRank - 5) and (@myRank +5);

Если вы хотите использовать чистый SQL, вам придется немного поработать, но это та же идея (только с подзапросами).

1 голос
/ 13 марта 2019

Один метод состоит в том, чтобы вычислить ранг для «x» и сравнить его с рангом для каждой строки:

select c.*
from (select max(case when id = @x then rank end) over () as x_rank
      from (select c.*, rank() OVER (ORDER BY score DESC ) as rank 
            from client c
           ) c
     ) c
where rank >= x_rank - 5 and rank <= x_rank + 5;

Обратите внимание, что это может не вернуть ровно 11 строк, если у вас есть связи.

Если вы хотите ровно 5 до и после плюс все строки с одинаковым счетом:

with c as (
      select max(case when id = @x then rank end) over () as x_rank
      from (select c.*, rank() OVER (ORDER BY score DESC ) as rank 
            from client c
           ) c
     )
(select c.*
 from c
 where rank < x_rank
 order by rank desc
 limit 5
) union all
(select c.*
 from c
 where rank = x_rank
) union all
(select c.*
 from c
 where rank > x_rank
 order by rank asc
 limit 5
) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...