【问题标题】:PostgreSQL: getting ordinal rank (row index? ) efficientlyPostgreSQL:有效地获得序数排名(行索引?)
【发布时间】:2012-02-24 03:09:34
【问题描述】:

你有一张这样的桌子:

id dollars dollars_rank points points_rank
1  20      1            35     1
2  18      2            30     3
3  10      3            33     2

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

【问题讨论】:

  • 领带呢? Analytics...
  • 他们只会有相同的排名。
  • 您使用的是哪个版本的 postgres?
  • @Wells:那么你想要 RANK 或 DENSE_RANK...

标签: postgresql ranking window-functions


【解决方案1】:

@OMG_Ponies 已经指出:window function dense_rank() 是您需要的 - 或者可能是 rank()UPDATE 可能如下所示:

测试用例:

CREATE TEMP TABLE tbl (
   id int
 , dollars int
 , dollars_rank int
 , points int
 , points_rank int
 );
INSERT INTO tbl VALUES
 (1, 20, 1, 35, 1)
,(2, 18, 2, 30, 3)
,(3, 10, 3, 33, 2)
,(4, 10, 3, 33, 2);  -- I put a dupe row in to demonstrate ties.

更新语句:

UPDATE tbl
SET    dollars_rank = r.d_rnk
     , points_rank  = r.p_rnk
FROM (
    SELECT id
         , dense_rank() OVER (ORDER BY dollars DESC) AS d_rnk
         , dense_rank() OVER (ORDER BY points DESC)  AS p_rnk
    FROM   tbl
    ) r
WHERE tbl.id = r.id

窗口函数需要 PostgreSQL 8.4 或更高版本

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2016-10-12
    • 2017-04-23
    • 2021-09-04
    相关资源
    最近更新 更多