From 63544803b9ba1949099c79b44e494437dea671a6 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 11 Jun 2005 23:40:15 +0000 Subject: [PATCH] Make a stored procedure implementation of finding min/max rank. --- sql/ccbs.sql | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) 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; -- 2.39.2