| From: | David Garamond <lists(at)zara(dot)6(dot)isreserved(dot)com> | 
|---|---|
| To: | pgsql-sql(at)postgresql(dot)org | 
| Subject: | olympics ranking query | 
| Date: | 2004-08-20 16:40:08 | 
| Message-ID: | 41262968.2000507@zara.6.isreserved.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-sql | 
See http://www.athens2004.com/en/OlympicMedals/medals?noc=MGL .
create table countrymedal (
   countryid CHAR(3) PRIMARY KEY,
   gold INT NOT NULL,
   silver INT NOT NULL,
   bronze INT NOT NULL);
COPY countrymedal (countryid, gold, silver, bronze) FROM stdin;
ITA	5	6	3
FRA	5	3	5
UKR	5	1	1
RUS	4	8	10
GER	4	4	7
TUR	3	0	1
KOR	2	7	3
NED	2	5	4
HUN	2	3	1
SVK	2	2	1
ROM	2	0	2
GRE	2	0	1
POL	1	2	1
BLR	1	1	2
SUI	1	0	1
UAE	1	0	0
GBR	0	4	4
AUT	0	3	0
PRK	0	2	1
ESP	0	2	0
CUB	0	1	5
CZE	0	1	2
ZIM	0	1	1
USA	15	11	10
CHN	15	9	8
JPN	9	4	2
AUS	7	5	8
GEO	1	1	0
RSA	1	1	0
BUL	1	0	2
THA	1	0	2
IND	0	1	0
INA	0	1	0
KAZ	0	1	0
POR	0	1	0
SCG	0	1	0
AZE	0	0	2
BEL	0	0	2
BRA	0	0	2
DEN	0	0	2
ARG	0	0	1
CAN	0	0	1
COL	0	0	1
CRO	0	0	1
ISR	0	0	1
MGL	0	0	1
SLO	0	0	1
TRI	0	0	1
\.
create sequence seq1;
create sequence seq2;
-- query #1: list of ranks by gold
select setval('seq1', 1);
select setval('seq2', 1);
select
   setval('seq1', currval('seq1')+setval('seq2',count(*)))-count(*) as rank,
   count(*) as numranker,
   gold, silver, bronze
from countrymedal
group by gold, silver, bronze
order by gold desc, silver desc, bronze desc;
-- result of query #1
  rank | numranker | gold | silver | bronze
------+-----------+------+--------+--------
     1 |         1 |   15 |     11 |     10
     2 |         1 |   15 |      9 |      8
     3 |         1 |    9 |      4 |      2
     4 |         1 |    7 |      5 |      8
     5 |         1 |    5 |      6 |      3
     6 |         1 |    5 |      3 |      5
     7 |         1 |    5 |      1 |      1
     8 |         1 |    4 |      8 |     10
     9 |         1 |    4 |      4 |      7
    10 |         1 |    3 |      0 |      1
    11 |         1 |    2 |      7 |      3
    12 |         1 |    2 |      5 |      4
    13 |         1 |    2 |      3 |      1
    14 |         1 |    2 |      2 |      1
    15 |         1 |    2 |      0 |      2
    16 |         1 |    2 |      0 |      1
    17 |         1 |    1 |      2 |      1
    18 |         1 |    1 |      1 |      2
    19 |         2 |    1 |      1 |      0
    21 |         2 |    1 |      0 |      2
    23 |         1 |    1 |      0 |      1
    24 |         1 |    1 |      0 |      0
    25 |         1 |    0 |      4 |      4
    26 |         1 |    0 |      3 |      0
    27 |         1 |    0 |      2 |      1
    28 |         1 |    0 |      2 |      0
    29 |         1 |    0 |      1 |      5
    30 |         1 |    0 |      1 |      2
    31 |         1 |    0 |      1 |      1
    32 |         5 |    0 |      1 |      0
    37 |         4 |    0 |      0 |      2
    41 |         8 |    0 |      0 |      1
(32 rows)
-- query #2: list of countries ordered by their ranks
select setval('seq1', 1);
select setval('seq2', 1);
select
   (case numranker when 1 then '' else '=' end) || rank as rank,
   countryid,
   cm.gold, cm.silver, cm.bronze
from countrymedal cm
left join
   (select
   setval('seq1',
          currval('seq1')+setval('seq2',count(*))
         )-count(*) as rank,
   count(*) as numranker,
   gold, silver, bronze
   from countrymedal
   group by gold, silver, bronze
   order by gold desc, silver desc, bronze desc
   ) t1 on cm.gold=t1.gold and cm.silver=t1.silver and cm.bronze=t1.bronze
order by t1.rank;
-- result of query #2
  rank | countryid | gold | silver | bronze
------+-----------+------+--------+--------
  1    | USA       |   15 |     11 |     10
  2    | CHN       |   15 |      9 |      8
  3    | JPN       |    9 |      4 |      2
  4    | AUS       |    7 |      5 |      8
  5    | ITA       |    5 |      6 |      3
  6    | FRA       |    5 |      3 |      5
  7    | UKR       |    5 |      1 |      1
  8    | RUS       |    4 |      8 |     10
  9    | GER       |    4 |      4 |      7
  10   | TUR       |    3 |      0 |      1
  11   | KOR       |    2 |      7 |      3
  12   | NED       |    2 |      5 |      4
  13   | HUN       |    2 |      3 |      1
  14   | SVK       |    2 |      2 |      1
  15   | ROM       |    2 |      0 |      2
  16   | GRE       |    2 |      0 |      1
  17   | POL       |    1 |      2 |      1
  18   | BLR       |    1 |      1 |      2
  =19  | GEO       |    1 |      1 |      0
  =19  | RSA       |    1 |      1 |      0
  =21  | BUL       |    1 |      0 |      2
  =21  | THA       |    1 |      0 |      2
  23   | SUI       |    1 |      0 |      1
  24   | UAE       |    1 |      0 |      0
  25   | GBR       |    0 |      4 |      4
  26   | AUT       |    0 |      3 |      0
  27   | PRK       |    0 |      2 |      1
  28   | ESP       |    0 |      2 |      0
  29   | CUB       |    0 |      1 |      5
  30   | CZE       |    0 |      1 |      2
  31   | ZIM       |    0 |      1 |      1
  =32  | IND       |    0 |      1 |      0
  =32  | INA       |    0 |      1 |      0
  =32  | KAZ       |    0 |      1 |      0
  =32  | POR       |    0 |      1 |      0
  =32  | SCG       |    0 |      1 |      0
  =37  | AZE       |    0 |      0 |      2
  =37  | BEL       |    0 |      0 |      2
  =37  | BRA       |    0 |      0 |      2
  =37  | DEN       |    0 |      0 |      2
  =41  | ARG       |    0 |      0 |      1
  =41  | CAN       |    0 |      0 |      1
  =41  | COL       |    0 |      0 |      1
  =41  | CRO       |    0 |      0 |      1
  =41  | ISR       |    0 |      0 |      1
  =41  | MGL       |    0 |      0 |      1
  =41  | SLO       |    0 |      0 |      1
  =41  | TRI       |    0 |      0 |      1
Challenge question: is there a simpler way to do query #1 (without any 
PL, and if possible without sequences too?
-- 
dave
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tom Lane | 2004-08-20 16:46:22 | Re: olympics ranking query | 
| Previous Message | SVGK, Raju (Raju) | 2004-08-20 15:55:54 | view triggers/procedures |