Sql 使用增量值更新列

Sql 使用增量值更新列,sql,sql-server,Sql,Sql Server,我有一张这样的桌子 userid | points | position 1 | 100 | NULL 2 | 89 | NULL 3 | 107 | NULL 我需要一个按points desc更新位置列顺序的查询,示例结果: userid | points | position 1 | 100 | 2 2 | 89 | 3 3 | 107 | 1 我不会使用依赖于其他行中的值的物理列,否则

我有一张这样的桌子

userid | points | position
1      | 100    | NULL
2      | 89     | NULL
3      | 107    | NULL
我需要一个按points desc更新位置列顺序的查询,示例结果:

userid | points | position
1      | 100    | 2
2      | 89     | 3
3      | 107    | 1

我不会使用依赖于其他行中的值的物理列,否则每次一行更改时都必须更新整个表。使用视图或其他机制动态计算位置

计算“位置”的查询如下所示:

SELECT 
    userid, 
    points, 
    RANK() OVER (ORDER BY points DESC) AS position
但是,如果您必须将其作为
更新
,那么您可以使用

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

但请记住,每次更新表时都需要运行更新,因此,如果表的大小合适且更新频繁,则性能可能会有问题。

我不会使用依赖于其他行中的值的物理列,否则每次一行更改时都必须更新整个表。使用视图或其他机制动态计算位置

计算“位置”的查询如下所示:

SELECT 
    userid, 
    points, 
    RANK() OVER (ORDER BY points DESC) AS position
但是,如果您必须将其作为
更新
,那么您可以使用

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

但请记住,每次更新表时都需要运行更新,因此,如果表的大小合适且更新频繁,则性能可能会有问题。

您可以执行以下操作:

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

您可以这样做:

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

也考虑使用DeNeSyRANK()代替RANK(),当你想把你的“位置”的排名递增1作为“点”的变化。RANK()将执行您想要的操作,但它将根据“点”中的重复“用户ID”数量(如果您的规范中有这种情况)创建数字序列间隔


参考它们之间的差异。

也考虑使用DeNeSyRANK()代替RANK(),当你想把你的“位置”的排名递增1作为“点”的变化。RANK()将执行您想要的操作,但它将根据“点”中的重复“用户ID”数量(如果您的规范中有这种情况)创建数字序列间隔


关于它们之间的区别,请参阅此部分。

您试过什么吗?比如把你的帖子的名字放进谷歌,前面有SQL?是的,但是没有什么对你的要求有用。你试过什么吗?比如说,把你的帖子的名字放进谷歌,前面有SQL?是的,但是没有什么对需求有用。对不起,我需要更新列,而不是获取增量ID,然后使用相同的原理进行更新查询。顺便说一句,假设这个答案与增量ID无关,你确定你真的理解了吗?@DaniloCalzetta我添加了一个潜在的
UPDATE
查询,并给出了相同的注意事项。很抱歉,我需要更新列以不获取增量ID,然后在更新查询中使用相同的原理。顺便说一句,考虑到这个答案与增量ID无关,你确定你真的理解了吗?@DaniloCalzetta我添加了一个潜在的
UPDATE
查询,并提出了同样的警告。