LINUX.ORG.RU

SQL-запрос, выдающий место в рейтинге (postgresql)

 ,


0

3

Имеется таблица users со следующей схемой:

vr=# select * from users;
 id |   name   |          regdate           | raiting 
----+----------+----------------------------+---------
  1 | me       | 2017-11-03 23:51:54.411796 |     -16
  2 | postgres | 2017-11-04 18:58:53.671633 |       0
  3 | root     | 2017-11-11 00:27:43.082693 |       0
(3 rows)

Необходимо выдавать место в рейтинге. Мне приходит в голову только сортировка по полю raiting с помощью order by, а потом работа в приложении c этой информацией. Может есть и другие пути?

★★★★★

man нумерация строк в запросе

bvn13 ★★★★★
()
Ответ на: комментарий от Jopich1

Спасибо за наводку, этот запрос решил проблему!

select r from (select row_number()  over (order by raiting desc) as r, id from users) ranksel where id=1;

cetjs2 ★★★★★
() автор топика
Ответ на: комментарий от Jopich1

Место в рейтинге для определенного пользователя нужно было находить, лол.

cetjs2 ★★★★★
() автор топика
Ответ на: комментарий от cetjs2

Результат будет в общем случае правильным только тогда, когда гарантируется уникальность рейтинга. В приведённом примере и postgres, и root должны иметь место 1, но один будет 1, а другой - 2, а me -3, хотя должен быть 2.

anonymous
()
Ответ на: комментарий от cetjs2

Выбрать рейтинг пациента и найти его место в уникальной выборке рейтингов, отсортированных по убыванию.

anonymous
()

dense_rank

with users as (
  select generate_series(1, 100) id, (10 * random())::int rating
)
select *, 
  row_number() over(order by rating) rn, 
  rank() over(order by rating) r, 
  dense_rank() over(order by rating) dr
from users
order by id
drsm ★★
()
Ответ на: комментарий от cetjs2

используй dense_rank вместо row_number

чтобы не было так:

В приведённом примере и postgres, и root должны иметь место 1, но один будет 1, а другой - 2, а me -3, хотя должен быть 2.

drsm ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.