回答

收藏

使用PostgreSQL更新前N个值

技术问答 技术问答 198 人阅读 | 0 人回复 | 2023-09-14

我想更新表中列出的前10个值。我有三栏;id,account和accountrank。我可以使用以下方法来获得前10个值:* B& @; H& |  k" e& O0 j
SELECT  * FROM accountrecords    ORDER BY account DESCLIMIT 10;我想做的是根据大小设置值accountrank为一系列。这是可以的PostgreSQL完成了吗?- 10``account
- l( t; P$ o$ S& \8 s                                                                # t& c" }2 X$ O( p) Z
    解决方案:                                                               
- t* e/ z5 ]! n& Q0 b/ l7 [/ l3 j' F* O                                                                WITH cte AS (2 H* o, p; n# s& X) n
                            SELECT id,row_number() OVER (ORDER BY account DESC NULLS LAST) AS rn
4 |% @; y  u7 I, i$ b9 W9 x                            FROM   accountrecords  
) L! m! B2 a# M3 ?3 g) v* v                            ORDER  BY account DESC NULLS LAST
0 s9 w0 ^- G) q3 c! s" y                            LIMIT  10
6 |4 j# |8 Q2 S) P                            )& Y7 k* t% Q* p$ H7 I3 s) S! Z
                UPDATE accountrecords a1 W2 s5 n5 i6 T4 ?
                SET    accountrank = cte.rn
% T" d" J/ p* m4 M3 E                FROM   cte
. J) p3 h& `" V* M3 C) n$ g8 C                WHERE  cte.id = a.id;
, I; s0 ~0 g. G联接表达式通常比关联子查询快。它也更短。% t- W9 W. |6 v) G1 G
通过窗口功能,row_number()可以保证不同的数字。如果您想共享相同的数字,请使用相同的行rank()(或可能使用dense_rank())account。
6 U7 S3 j% R. X( H# a- v, w8 N+ L仅当中包含NULL值时account,才需要追加NULLSLAST或将降序排列NULL排名第一:
% L, O6 N1 w& N$ x- mPostgreSQL按datetime asc排名,是否为null?如果可以并发写访问权,上述查询将被 接受影响竞争条件    。
: ?& J8 Q3 |; K  g7 ?# m但是,如果是这样的话,那么前十名硬编码的整个概念一开始就是一种可疑的方法。
) @/ `/ q' N3 `* A1 F. @使用CTE而不是普通的子查询(如我刚开始的那样)LIMIT可靠实施。请参考上述链接。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则