当前位置: 首页 > 面试题库 >

使用PostgreSQL更新前N个值

夏华藏
2023-03-14
问题内容

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

SELECT  * FROM accountrecords    
ORDER BY account DESC
LIMIT 10;

我想做的是根据的大小将值设置accountrank为一系列。这可以在PostgreSQL中完成吗?1 - 10``account


问题答案:

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;


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

通过窗口功能row_number()可以保证不同的数字。如果希望具有相等值的行共享相同的编号,请使用rank()(或可能使用dense_rank()account

仅当中包含NULL值时account,才需要追加NULLS LAST以降序排列,或将NULL值排在最前面:

  • PostgreSQL按datetime asc排序,是否为null?

如果可以存在并发写访问权,则上面的查询会受到 竞争条件的影响

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

使用CTE而不是普通的子查询(如我刚开始的那样)来LIMIT可靠地实施。请参阅上面的链接。



 类似资料:
  • 问题内容: 我有这样的查询: 但是我只想对前400名进行此操作。我尝试添加“ limit 0,400”(就像我在查询中那样),但这没有用。我进行了一些搜索,而mysql似乎不像SQL Server那样支持TOP(n)命令。 知道我该怎么做吗? 编辑:为了将来参考,我使用以下样式进行选择,效果很好: 但无论出于何种原因,在更新中它都不会与“ 0”一起使用。我会认为这种不一致和模棱两可的行为,但是哦。

  • 在我的Java项目中,我是usinq、JOOQ,我希望更新JSONB值。但我的建造失败了。 我写了一段代码: 我收到了下一条信息: 我犯错的地方?

  • 我有以下不便之处,我想只使用PostgreSQL更新JSON数组的键。我有以下json: 如果“othern”=X,我需要将“othern”更新为另一个数字 (X是我传递给查询的任何数字。例如,如果othern=5,则更新othern)。 这个JSON可能要大得多,所以我需要一些可以在JSON数组中迭代的东西,找到所有与X数匹配的“othern”,并替换为新的。非常感谢。 我尝试了Postgres

  • 问题内容: | uId | title | amount | makers | widgets | 1 richard 998 xcorp sprocket 2 swiss 995 ycorp framitz 3 ricky 90 zcorp flobber 4 ricky2 798 xcorp framitz 1 lilrick 390 xcorp sprocket 1 brie 200 mco

  • 问题内容: 我有大约1000行的表。我必须将n个随机行的表中的column(“ X”)更新为’Y’。为此,我可以有以下查询 是否有另一种有效的方式来编写此查询。该表没有索引。请帮忙? 问题答案: 我将使用ROWID: 我使用ROWID的实际原因并不是为了提高效率(它仍然会进行全表扫描)-如果列不是唯一的,则您的SQL可能不会更新所需的行数。 只有1000行,您不必担心效率(也许有一亿行)。该表上没

  • 我有一个有4列的数据帧,第一列等于计数器,计数器的值为十六进制。 时间列是添加到原始数据帧中的新列。我想在x轴上绘制时间,在y轴上绘制频率、电阻和相位。