首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有增量值的更新列

具有增量值的更新列
EN

Stack Overflow用户
提问于 2016-05-11 17:12:02
回答 3查看 1.8K关注 0票数 0

我有一张这样的桌子

代码语言:javascript
运行
复制
userid | points | position
1      | 100    | NULL
2      | 89     | NULL
3      | 107    | NULL

我需要一个查询来更新按points排序的职位列的顺序,例如结果:

代码语言:javascript
运行
复制
userid | points | position
1      | 100    | 2
2      | 89     | 3
3      | 107    | 1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-11 17:16:53

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

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

代码语言:javascript
运行
复制
SELECT 
    userid, 
    points, 
    RANK() OVER (ORDER BY points DESC) AS position

然而,如果您必须使它成为一个UPDATE,那么您可以使用类似的

代码语言:javascript
运行
复制
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

但是,请记住,每次更新表时都需要运行更新,因此,如果要更新大量的适当大小的表,那么性能可能是一个问题。

票数 3
EN

Stack Overflow用户

发布于 2016-05-11 18:30:49

另外,当您希望将“位置”的排名增加1时,请考虑使用DENSE_RANK()而不是秩()作为“点数”的变化。秩()会做你想做的事情,尽管它会根据重复的'userids‘在’积分‘中相等的数量(如果在您的规范中是这样的话)来创建数字序列缺口。

有关它们之间的差异,请参考此answer

票数 1
EN

Stack Overflow用户

发布于 2016-05-11 17:50:09

你可以这样做:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37169215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档