我有一张这样的表
userid | points | position
1 | 100 | NULL
2 | 89 | NULL
3 | 107 | NULL
我需要一个查询来更新点desc的位置列排序,例如结果:
userid | points | position
1 | 100 | 2
2 | 89 | 3
3 | 107 | 1
答案 0 :(得分:3)
我不会使用依赖于其他行中的值的物理列,否则每次更改一行时都必须更新整个表。使用视图或其他机制来动态计算位置。
计算“位置”的查询看起来像:
SELECT
userid,
points,
RANK() OVER (ORDER BY points DESC) AS position
但是,如果 使其成为UPDATE
,那么您可以使用类似
UPDATE a
SET a.position = b.position
FROM {table_name} a
INNER JOIN
(
SELECT
userid,
RANK() OVER (ORDER BY points DESC) AS position
FROM {table_name}
) b
ON a.userid = b.userid
但请记住,每次更新表时都需要运行更新 ,因此如果性能大小的表经常更新,性能可能会成为问题。
答案 1 :(得分:1)
当你想增加你的位置排名时,还要考虑使用DENSE_RANK()而不是RANK()。由1作为'点'更改。 RANK()会做你想要的,虽然它会根据有多少重复的用户ID来创建数字序列间隙。在“积分”中是平等的站着(如果你的规范中的情况如此)。
请参阅此answer了解它们之间的区别。
答案 2 :(得分:0)
您可以这样做:
UPDATE t
SET position = t2.position
FROM table t
JOIN (
SELECT
userid,
points,
RANK() OVER (ORDER BY points DESC) AS position
FROM table) t2 ON t2.userid = t.userid