Sql 每周比赛的奖牌数
我有一张表,上面有球员每周的得分:Sql 每周比赛的奖牌数,sql,postgresql,postgresql-8.4,Sql,Postgresql,Postgresql 8.4,我有一张表,上面有球员每周的得分: # select * from pref_money limit 5; id | money | yw ----------------+-------+--------- OK32378280203 | -27 | 2010-44 OK274037315447 | -56 | 2010-44 OK19644992852 | 8 | 2010-44 OK21807961329 | 114 | 20
# 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;
您可以创建一个使用奖牌选择的视图,并将其与实际数据关联:
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;
奖牌是什么?这是每周获胜数吗?是的,没错。感谢大家关注我的问题,你多久做一次这个工作?我怀疑您正在尝试更新,而上一个更新仍在运行。那些桌子有多大?不相关,但您应该将这两个更新打包在一个事务中,否则归零的奖牌将立即可见。谢谢!我只需要添加更新pref_用户集。。。。其中u.id=s.id,因为pgsql正在抱怨列引用id为ambiguous@AlexanderFarber不使用'id'作为列标识符,而是通过示例为表pref\u money使用pref\u money\u id,这是一种很好的做法。这使得读取查询和允许自然连接变得更容易。@greg我建议只使用id。关于自然连接,我认为您是反向的。您可能知道我为什么会出现错误:检测到死锁?有关详细信息,请参阅我更新的问题
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