我经营一个Carrom俱乐部,我为每场比赛配对两名球员,然后将比赛结果记录在GamesTable
。玩家的ID可以显示在Player1ID
列或Player2ID
列中,具体取决于谁赢得折腾。 GamesTable
表如下所示:
| GameID | Player1ID | Player2ID | Player1RatingAfterGame | Player2RatingAfterGame | |--------|-----------|-----------|------------------------|------------------------| | 5579 | 33 | 166 | 1020 | 980 | | 5580 | 155 | 67 | 980 | 1020 | | 5581 | 66 | 57 | 980 | 1020 | | 5582 | 29 | 160 | 1020 | 980 | | 5583 | 167 | 166 | 1019 | 961 | | 5584 | 167 | 29 | 1004 | 1035 | | 5585 | 67 | 155 | 1033 | 962 |
我正在尝试运行一个查询来生成一个排行榜,其中玩家的评分来自他的最新游戏'被采取。高评分的玩家获得排行榜的顶峰。 ('最新游戏'由GameID定义。最近的游戏有更高的GameID。)
我的目标是获得这样的输出:
| Rank | PlayerID | PlayerLatestRating | |------|----------|--------------------| | 1 | 67 | 1033 | | 2 | 33 | 1020 | | 3 | 66 | 980 | | 4 | 155 | 962 | | 5 | 166 | 961 |
如果playerID位于单个列中,则运行查询会更容易。但在我的情况下,playerID出现在两列中。如何将它们归入一个列并获得最新评级?
提前致谢。
答案 0 :(得分:2)
答案 1 :(得分:0)
尝试使用RENAME和UNION子句合并
rename = function(string){
tmp = strsplit(string, " ")
if(length(tmp[[1]]) > 2){
return(toupper(paste(unlist(lapply(tmp, substring, 1, 1)),collapse = "")))
}else{
return(paste(unlist(tmp), collapse = " "))
}
}
> rename("Oral Language Ability of Minors")
[1] "OLAOM"
> rename("Oral Language")
[1] "Oral Language"
答案 2 :(得分:0)
您可以通过以下查询获得每位玩家的最新游戏ID:
SELECT a.pid, max(a.gid)
FROM (
SELECT player1ID as pid, MAX(gameID) as gid
FROM GamesTable
GROUP BY Player1ID
UNION
SELECT player2ID as pid, MAX(gameID) as gid
FROM GamesTable
GROUP BY Player2ID
) a;
获得这些ID之后,您可以使用SELECT
语句编写CASE
来获取分数,具体取决于pid是该游戏中的player1还是player2,并按降序对其进行排序。 / p>