使用增量值更新列

时间:2016-05-11 17:12:02

标签: sql sql-server

我有一张这样的表

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

3 个答案:

答案 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