1+ UPDATE players
2+ SET score = 0 .0
3+ WHERE score IS NULL ;
4+
5+ ALTER TABLE players
6+ ALTER COLUMN score
7+ SET NOT NULL ;
8+
9+ CREATE OR REPLACE FUNCTION record_score (progress FLOAT, demon FLOAT, list_size FLOAT, requirement FLOAT) RETURNS FLOAT AS
10+ $record_score$
11+ SELECT CASE
12+ WHEN progress = 100 THEN
13+ CASE
14+
15+ WHEN 55 < demon AND demon <= 150 THEN
16+ (56 .191 * EXP(LN(2 ) * ((54 .147 - (demon + 3 .2 )) * LN(50 .0 )) / 99 .0 )) + 6 .273
17+ WHEN 35 < demon AND demon <= 55 THEN
18+ 212 .61 * (EXP(LN(1 .036 ) * (1 - demon))) + 25 .071
19+ WHEN 20 < demon AND demon <= 35 THEN
20+ (250 - 83 .389 ) * (EXP(LN(1 .0099685 ) * (2 - demon))) - 31 .152
21+ WHEN demon <= 20 THEN
22+ (250 - 100 .39 ) * (EXP(LN(1 .168 ) * (1 - demon))) + 100 .39
23+
24+ END
25+
26+ WHEN progress < requirement THEN
27+ 0 .0
28+ ELSE
29+ CASE
30+
31+ WHEN 55 < demon AND demon <= 150 THEN
32+ ((56 .191 * EXP(LN(2 ) * ((54 .147 - (demon + 3 .2 )) * LN(50 .0 )) / 99 .0 )) + 6 .273 ) * (EXP(LN(5 ) * (progress - requirement) / (100 - requirement))) / 10
33+ WHEN 35 < demon AND demon <= 55 THEN
34+ (212 .61 * (EXP(LN(1 .036 ) * (1 - demon))) + 25 .071 ) * (EXP(LN(5 ) * (progress - requirement) / (100 - requirement))) / 10
35+ WHEN 20 < demon AND demon <= 35 THEN
36+ ((250 - 83 .389 ) * (EXP(LN(1 .0099685 ) * (2 - demon))) - 31 .152 ) * (EXP(LN(5 ) * (progress - requirement) / (100 - requirement))) / 10
37+ WHEN demon <= 20 THEN
38+ ((250 - 100 .39 ) * (EXP(LN(1 .168 ) * (1 - demon))) + 100 .39 ) * (EXP(LN(5 ) * (progress - requirement) / (100 - requirement))) / 10
39+
40+ END
41+ END;
42+ $record_score$
43+ LANGUAGE SQL IMMUTABLE;
44+
45+ CREATE OR REPLACE FUNCTION recompute_player_scores () RETURNS void AS $$
46+ UPDATE players
47+ SET score = coalesce(q .score , 0 )
48+ FROM players p
49+ LEFT OUTER JOIN (
50+ SELECT player, SUM (record_score(progress, position, 150 , requirement)) as score
51+ FROM score_giving
52+ GROUP BY player
53+ ) q
54+ ON q .player = p .id
55+ WHERE players .id = p .id ;
56+ $$ LANGUAGE SQL;
57+
58+ CREATE OR REPLACE VIEW ranked_players AS
59+ SELECT
60+ ROW_NUMBER() OVER(ORDER BY players .score DESC , id) AS index,
61+ RANK() OVER(ORDER BY players .score DESC ) AS rank,
62+ id, name, players .score , subdivision,
63+ nationalities .iso_country_code ,
64+ nationalities .nation ,
65+ nationalities .continent
66+ FROM players
67+ LEFT OUTER JOIN nationalities
68+ ON players .nationality = nationalities .iso_country_code
69+ WHERE NOT players .banned AND players .score > 0 .0 ;
70+
71+ SELECT recompute_player_scores();
0 commit comments