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_rank和points_rank) 的查询来设置给定 ID 的排名,这只是该 ID 的行索引,按相关列按降序排序。在 PostgreSQL 中如何最好地做到这一点?
窗口函数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: