X-Git-Url: https://git.sesse.net/?p=ccbs;a=blobdiff_plain;f=sql%2Fccbs.sql;fp=sql%2Fccbs.sql;h=ab682cdcacfa6b5dbe749b6722024e84328f834f;hp=fa63774a20817419cadc4213bcaa223fb7b26921;hb=63544803b9ba1949099c79b44e494437dea671a6;hpb=f30cdfc0dd86119e0efcd318d08589fd52be4ab4 diff --git a/sql/ccbs.sql b/sql/ccbs.sql index fa63774..ab682cd 100644 --- a/sql/ccbs.sql +++ b/sql/ccbs.sql @@ -305,4 +305,34 @@ $$ LANGUAGE plpgsql STABLE RETURNS NULL ON NULL INPUT; + +-- use the minmax_score as a basis for finding best and worst possible ranks +CREATE TYPE minmax_rank AS ( + player INTEGER, + best_rank INTEGER, + worst_rank INTEGER +); + +-- get_minmax_score_for_players(tournament, round, playmode) +CREATE FUNCTION get_minmax_rank_for_players(integer, integer, varchar) RETURNS SETOF minmax_rank + AS $$ +DECLARE + ret minmax_rank; + tp RECORD; +BEGIN + CREATE TEMPORARY TABLE temp_minmax AS SELECT * FROM get_minmax_score_for_players($1, $2, $3); + FOR tp IN SELECT * FROM temp_minmax LOOP + ret.player = tp.player; + ret.best_rank = 1 + ( SELECT COUNT(*) FROM temp_minmax WHERE min_score >= tp.max_score AND player<>tp.player); + ret.worst_rank = 1 + ( SELECT COUNT(*) FROM temp_minmax WHERE max_score > tp.min_score AND player<>tp.player ); + + RETURN NEXT ret; + END LOOP; + DROP TABLE temp_minmax; + RETURN; +END; + $$ + LANGUAGE plpgsql + VOLATILE -- not really, but needed for the TEMPORARY TABLE + RETURNS NULL ON NULL INPUT;