如何在 PostgreSQL 中获取每个等级的平均行数?

How to get the average row number per rank in PostgreSQL?

是否有任何选项可以使用 PostgreSQL 中的 RANK() 函数获取相同值的平均值?这是我想做的事的例子:

我很确定你想要 row_number(),而不是 rank()。 Rank 不会以您呈现的方式给出重复值。要获得您正在寻找的答案:

with rwn as (
  select
    test_score
    ,row_number() over (order by test_score) rwn
  from
    score
)
select
  test_score
  ,avg(rwn) average_rank
from
  rwn
group by
  test_score;

这是一个SQLFiddle

此查询将为您解决问题

SELECT
  test_score,
  row_number() OVER (ORDER BY test_score) AS rank,
  rank() OVER (ORDER BY test_score) 
    + (count(*) OVER (PARTITION BY test_score) - 1) / 2.0 AS "rank (with tied)"
FROM scores

SQLFiddle

备注:

  • 您认为的 "rank" 实际上是 row_number()(即连续的一系列正整数,没有间隙也没有重复)。
  • 您要查找的排名 "with tied" 可以根据实际 rank()(有差距的排名)+ other 元素的数量计算得出同等级的除以二。根据您的特定要求,这是计算平均值的更快快捷方式 row_number()

and 已经解释了 rank()row_number() 之间的区别,你似乎错过了。

您还可以在下一步中计算行号 (rn) 和每个等级 rn (avg_rn) 的平均值(= 每组相同值) :

SELECT test_score, rn, avg(rn) OVER (PARTITION BY test_score) AS avg_rn
FROM  (SELECT test_score, row_number() OVER (ORDER BY test_score) AS rn FROM tbl) sub;

您需要一个子查询,因为 window 函数不能嵌套在同一查询级别。

你需要另一个window函数不是一个聚合函数已被建议)以保留所有原始行。

结果默认按 rn 排序(对于这个简单的查询),但这只是一个实现细节。为了保证有序的结果,添加一个明确的 ORDER BY (几乎没有成本):

...
ORDER  BY rn;

SQL Fiddle.