Last active
May 1, 2018 13:25
-
-
Save whazor/27e93f6163fcc65c7b658462cdf73f43 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
WITH RECURSIVE p(current_game_number) AS | |
(WITH players AS (SELECT DISTINCT player_name FROM players) | |
SELECT (select min(id) from plays) AS game_number, player_name, 1000.0 AS elo | |
FROM players | |
UNION ALL | |
(WITH previous_elos AS (SELECT * FROM p) | |
SELECT plays.id, | |
player_name, | |
CASE | |
WHEN player_name NOT IN (plays."right", plays."left") THEN previous_elos.elo | |
WHEN player_name = plays."right" THEN | |
previous_elos.elo + 32.0 * ((plays.chosen = plays."right")::int + ((plays.chosen = 'none')::int)*.5 - (r1 / (r1 + r2))) | |
ELSE | |
previous_elos.elo + 32.0 * ((plays.chosen = plays."left")::int + ((plays.chosen = 'none')::int)*.5 - (r2 / (r1 + r2))) | |
END | |
FROM plays | |
JOIN previous_elos ON current_game_number = plays.id - 1 | |
JOIN LATERAL | |
(SELECT pow(10.0, previous_elos.elo / 400.0) AS r1, | |
pow(10.0, previous_elos.elo / 400.0) AS r2) r ON TRUE | |
)) | |
select * from (select distinct on(player_name) | |
player_name, last_value(elo) OVER (PARTITION BY player_name ORDER BY current_game_number desc) as rating | |
from p) results order by rating desc; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
adopted from https://elliot.land/post/elo-rating-system-implemented-in-single-sql-select