如何获得PostgreSQL中每个级别的平均行数?

时间:2016-04-24 13:02:17

标签: postgresql average rank row-number

是否有任何选项可以使用PostgreSQL中的printf函数获取相同值的平均值?以下是我想要做的例子:

example

3 个答案:

答案 0 :(得分:1)

此查询将为您解决问题

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()(即一系列连续的正整数,没有间隙且没有重复)。
  • 排名"并列#34;您正在查找的内容可以从真实rank()(带有差距的排名)+相同等级的其他元素的数量除以2计算得出。根据您的具体要求,这是计算平均值row_number()的更快捷方式。

答案 1 :(得分:0)

我确定你想要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

答案 2 :(得分:0)

@Lukas@jeremy已经解释了您似乎缺少rank()row_number()之间的区别。

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

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;

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

您需要另一个窗口函数 聚合函数,如同建议的那样)以保留所有原始行。

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

...
ORDER  BY rn;

SQL Fiddle.