如何在 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
备注:
- 您认为的 "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;
是否有任何选项可以使用 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
备注:
- 您认为的 "rank" 实际上是
row_number()
(即连续的一系列正整数,没有间隙也没有重复)。 - 您要查找的排名 "with tied" 可以根据实际
rank()
(有差距的排名)+ other 元素的数量计算得出同等级的除以二。根据您的特定要求,这是计算平均值的更快快捷方式row_number()
。
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;