在GROUP BY产生的一组行中创建排名



我有以下表格

CREATE TABLE "results" (
"player"    INTEGER,
"tournament"    INTEGER,
"year"  INTEGER,
"course"    INTEGER,
"round" INTEGER,
"score" INTEGER,
);

使用以下单个tournament/year/round组合的数据样本

1  33  2016  895  1  20  
2  33  2016  895  1  10
3  33  2016  895  1  25
4  33  2016  895  1  28
7  33  2016  895  1  25
8  33  2016  895  1  17
9  33  2016  895  1  12

我想创建一个名为ranking的新列,表示特定tournament/year/round组合的玩家排名。得分最多的玩家是1号。如果两名球员得分相同,则他们打成平手,这需要用&;t &;来指定。

期望的输出如下所示:

1  33  2016  895  1  20  3
2  33  2016  895  1  12  T5 
3  33  2016  895  1  25  T2
4  33  2016  895  1  28  1 
7  33  2016  895  1  25  T2
8  33  2016  895  1  17  4
9  33  2016  895  1  12  T5

我如何才能实现上述目标?由于

使用DENSE_RANK()窗口函数进行排名,COUNT()窗口函数检查是否需要在开始时连接'T':

SELECT *,
CASE WHEN COUNT(*) OVER (PARTITION BY tournament, year, course, round, score) > 1 THEN 'T' ELSE '' END ||
DENSE_RANK() OVER (PARTITION BY tournament, year, course, round ORDER BY score DESC) AS ranking
FROM results
ORDER BY player;


如果course对这个排名不重要,则从PARTITION BY子句中删除它。

最新更新