Рейтинг ранжирования PostgreSQL - PullRequest
0 голосов
/ 28 февраля 2012

Я пытаюсь сделать что-то похожее на this , но с дополнительным усложнением, которое мне нужно сгруппировать по общему полю

У меня есть две таблицы, одна для competition_users (дляучаствующих в соревнованиях) и еще один competition_times (чтобы сохранить их самые быстрые времена), но в одной таблице много разных соревнований.

Я создал новый столбец rank в таблице competition_timesи теперь нужно запустить обновление для существующих пользователей, чтобы показать их рейтинг в соревновании. Я пытаюсь изменить решение, приведенное в другом ответе SO, безуспешно

Таблицы выглядят следующим образом ...

Competition_users:

competition_user_id, competition_id

Competition_times:

competition_time_id, competition_user_id, time_in_seconds, rank

Я не уверен, возможно ли использовать GROUP BY?или, если есть другой способ, пока я пытаюсь что-то вроде этого ...

UPDATE competition_times
SET    rank = r.rnk
FROM (
    SELECT competition_time_id
         , dense_rank() OVER (ORDER BY time_in_seconds ASC) AS rnk
    FROM competition_times, competition_users
    WHERE competition_times.competition_user_id = competition_users.competition_user_id
    GROUP BY competition_users.competition_id
    ) r
WHERE competition_times.competition_time_id = r.competition_time_id

Использование PostgreSQL 9

Спасибо

1 Ответ

5 голосов
/ 28 февраля 2012

Вы должны использовать предложение PARTITION BY в оконной функции, чтобы разделить ранги между соревнованиями.

UPDATE competition_times
SET    
    rank = r.rnk
FROM (
    SELECT competition_time_id, dense_rank() OVER (PARTITION BY competition_id ORDER BY time_in_seconds ASC) AS rnk
    FROM competition_times
    INNER JOIN competition_users
      ON competition_times.competition_user_id = competition_users.competition_user_id
    ) r
WHERE competition_times.competition_time_id = r.competition_time_id

С примерами данных ниже:

create table competition_users
(competition_user_id  int, competition_id   int);

create table competition_times
(competition_time_id int, competition_user_id int, time_in_seconds int, rank int);

insert into competition_users values 
(1,1),(2,1),(3,1),(4,1),(5,2),(6,2);

insert into competition_times values 
(1,1,10,null),
(2,2,20,null),
(3,3,15,null),
(4,4,15,null),
(5,5,10,null),
(6,6,7,null);

Iполучить результаты в Competition_times:

competition_time_id competition_user_id time_in_seconds rank
1                   1                   10              1
2                   2                   20              3
3                   3                   15              2
4                   4                   15              2
5                   5                   10              2
6                   6                    7              1

Где строки 1-4 относятся к одному соревнованию, а строки 5 и 6 - к другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...