PostgreSQL:有效获取序数排名(行索引?)

Wel*_*lls 4 postgresql ranking window-functions

你有一个像这样的表:

id dollars dollars_rank points points_rank
1  20      1            35     1
2  18      2            30     3
3  10      3            33     2
Run Code Online (Sandbox Code Playgroud)

我想要一个更新表的排名列 (dollars_rankpoints_rank) 的查询来设置给定 ID 的排名,这只是该 ID 的行索引,按相关列按降序排序。在 PostgreSQL 中如何最好地做到这一点?

Erw*_*ter 5

窗口函数dense_rank()就是您所需要的——或者也许是rank()。可能UPDATE看起来像这样:

UPDATE tbl
SET    dollars_rank = r.d_rnk
     , points_rank  = r.p_rnk
FROM  (
    SELECT id
         , dense_rank() OVER (ORDER BY dollars DESC NULLS LAST) AS d_rnk
         , dense_rank() OVER (ORDER BY points  DESC NULLS LAST) AS p_rnk
    FROM   tbl
    ) r
WHERE  tbl.id = r.id;
Run Code Online (Sandbox Code Playgroud)

小提琴

NULLS LAST仅当涉及的列可以是NULL