Целое число медалей на еженедельных турнирах

У меня есть стол, вмещающий еженедельное множество игроков:

# select * from pref_money limit 5;
       id       | money |   yw
----------------+-------+---------
 OK32378280203  |   -27 | 2010-44
 OK274037315447 |   -56 | 2010-44
 OK19644992852  |     8 | 2010-44
 OK21807961329  |   114 | 2010-44
 FB1845091917   |   774 | 2010-44
(5 rows)

Этот SQL-оператор получает меня еженедельные победители и сколько раз выиграл каждый игрок:

# select x.id, count(x.id) from (
    select id,
           row_number() over(partition by yw order by money desc) as ranking
    from pref_money
) x
where x.ranking = 1 group by x.id;
           id           | count
------------------------+-------
 OK9521784953           |     1
 OK356310219480         |     1
 MR797911753357391363   |     1
 OK135366127143         |     1
 OK314685454941         |     1
 OK308121034308         |     1
 OK4087658302           |     5
 OK452217781481         |     6
....

Я хотел бы спасти последнее число в медали колонка таблицы игроков:

# \d pref_users;
                   Table "public.pref_users"
   Column   |            Type             |     Modifiers
------------+-----------------------------+--------------------
 id         | character varying(32)       | not null
 first_name | character varying(64)       |
 last_name  | character varying(64)       |
 city       | character varying(64)       |
 medals     | integer                     | not null default 0

Как сделать это, пожалуйста? Я могу только думать об использовании временной таблицы, но... должен быть более легкий путь Спасибо

ОБНОВЛЕНИЕ:

Вопрос, предложенный работами Clodoaldo, но теперь моим cronjob иногда, терпит неудачу с:

/* reset and then update medals count */
update pref_users set medals = 0;
psql:/home/afarber/bin/clean-database.sql:63: ERROR:  deadlock detected
DETAIL:  Process 31072 waits for ShareLock on transaction 124735679; blocked by process 30368.
Process 30368 waits for ShareLock on transaction 124735675; blocked by process 31072.
HINT:  See server log for query details.

update pref_users u
set medals = s.medals
from (
    select id, count(id) medals
    from (
        select id,
            row_number() over(partition by yw order by money desc) as ranking
        from pref_money where yw <> to_char(CURRENT_TIMESTAMP, 'IYYY-IW')
    ) x
    where ranking = 1
    group by id
) s
where u.id = s.id;
4
nl ja de
Да, точно. Благодаря всем для рассмотрения моего вопроса
добавлено автор Alexander Farber, источник
Как часто вы управляете той работой? Я подозреваю, что вы пытаетесь обновить, в то время как предыдущее обновление все еще бежит. Насколько большой те столы? Не связанный, но необходимо обернуть те два обновления в сделку иначе, обнуленные медали будут на мгновение видимы.
добавлено автор Clodoaldo Neto, источник
Что медали ? Это, еженедельно выигрывает количество?
добавлено автор Hamlet Hakobyan, источник

2 ответы

update pref_users u
set medals = s.medals
from (
    select id, count(id) medals
    from (
        select id,
            row_number() over(partition by yw order by money desc) as ranking
        from pref_money
    ) x
    where ranking = 1
    group by id
) s
where u.id = s.id
1
добавлено
Спасибо! Я просто должен был добавить обновление pref_users u набор...., где u.id = s.id , потому что pgsql жаловался ссылку колонки "id", неоднозначен
добавлено автор Alexander Farber, источник
Сделайте вас, возможно, знают, почему, я добирающийся <кодирую> ОШИБКУ: мертвая блокировка обнаружена ? Пожалуйста, посмотрите мой обновленный вопрос для деталей
добавлено автор Alexander Farber, источник
@Alexander хорошо обновляется
добавлено автор Clodoaldo Neto, источник
@greg, которым я советовал бы, чтобы использовать просто id . О естественное соединение я думаю, что вы получили его назад.
добавлено автор Clodoaldo Neto, источник
@AlexanderFarber это - хороший practive, чтобы не использовать ' id' как идентификатор столбца, но pref_money_id для стола pref_money примером. Это делает легче читать, вопросы и позволить ЕСТЕСТВЕННЫЕ СОЕДИНЕНИЯ .
добавлено автор greg, источник

Вы могли создать представление, которое использует ваше "избранное медалью" и присоединяется к нему с фактическими данными:

CREATE VIEW pref_money_medals AS
SELECT *
FROM pref_money
JOIN (SELECT count(x.id)
      FROM (SELECT id, row_number() 
            OVER(PARTITION BY yw ORDER BY money DESC) AS ranking
            FROM pref_money
            ) x
      WHERE x.ranking = 1 group by x.id) medals
ON pref_money.id = medals.id;
1
добавлено
pgsql – PostgreSQL
pgsql – PostgreSQL
2 429 участник(ов)

Чат про PostgreSQL

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)