答案 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
row_number()
(即一系列连续的正整数,没有间隙且没有重复)。 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
)和平均值rn
(avg_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;