我有一张这样的桌子
userid | points | position
1      | 100    | NULL
2      | 89     | NULL
3      | 107    | NULL我需要一个查询来更新按points排序的职位列的顺序,例如结果:
userid | points | position
1      | 100    | 2
2      | 89     | 3
3      | 107    | 1发布于 2016-05-11 17:16:53
我不会使用依赖于其他行中的值的物理列,否则每次更改一行时都必须更新整个表。使用视图或其他机制计算动态位置。
计算“位置”的查询如下所示:
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但是,请记住,每次更新表时都需要运行更新,因此,如果要更新大量的适当大小的表,那么性能可能是一个问题。
发布于 2016-05-11 18:30:49
另外,当您希望将“位置”的排名增加1时,请考虑使用DENSE_RANK()而不是秩()作为“点数”的变化。秩()会做你想做的事情,尽管它会根据重复的'userids‘在’积分‘中相等的数量(如果在您的规范中是这样的话)来创建数字序列缺口。
有关它们之间的差异,请参考此answer。
发布于 2016-05-11 17:50:09
你可以这样做:
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.useridhttps://stackoverflow.com/questions/37169215
复制相似问题