gpt4 book ai didi

sql - 使用 PostgreSQL 更新前 N 个值

转载 作者:行者123 更新时间:2023-11-29 11:13:36 26 4
gpt4 key购买 nike

我想更新表中某列的前 10 个值。我有三列; id , accountaccountrank .要获得前 10 个值,我可以使用以下方法:

SELECT  * FROM accountrecords    
ORDER BY account DESC
LIMIT 10;

我想做的是在 accountrank 中设置值成为一系列 1 - 10 , 基于 account 的大小.在 PostgreSQL 中可以做到这一点吗?

最佳答案

WITH cte AS (
SELECT id, row_number() OVER (ORDER BY account DESC NULLS LAST) AS rn
FROM accountrecords
ORDER BY account DESC NULLS LAST
LIMIT 10
)
UPDATE accountrecords a
SET accountrank = cte.rn
FROM cte
WHERE cte.id = a.id;

加入表表达式通常比关联子查询更快。它也更短。

随着window function row_number()不同的数字是有保证的。如果您希望 account 的值相同的行共享相同的数字,请使用 rank()(或者可能是 dense_rank())。

只有当account中可以有NULL值时,才需要追加NULLS LAST对于降序排序,或 NULL 值排序在顶部:

如果可以并发写访问,则上述查询受制于竞争条件。考虑:

但是,如果真是这样,那么硬编码前十名的整个概念从一开始就是一个可疑的方法。

使用 CTE 而不是普通子查询来可靠地执行 LIMIT。请参阅上面的链接。

关于sql - 使用 PostgreSQL 更新前 N 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13187419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com