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 этой информацией. Может есть и другие пути?

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

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

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 ()