如果
我有以下表格
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
子句中删除它。