SQL ranking multiple groups

梦想的初衷 提交于 2019-12-12 03:38:01

问题


For a project I was asked to design a DB for a small Olympic games. This is the ER diagram I made for the DB.

For one of the required queries, I need to list the sport, event, name, country, and result(medal) for everyone. So far the only problem I am having is ranking(assigning GOLD, SILVER, or BRONZE) each of the results based only on others in the same event.

My query so far:

SELECT cy.countryname COUNTRY, 
       c.firstname || ' ' || c.lastname "COMPETITOR", 
       s.sportname, 
       e.eventname EVENT, 
       rs.result
   FROM COUNTRY cy
   JOIN COMPETITOR c ON cy.COUNTRYID = c.COUNTRYID
   JOIN RESULT rs ON c.competitorid = rs.competitorid
   JOIN EVENT e ON rs.eventid = e.eventid
   JOIN SPORT s ON e.sportid = s.sportid
   ORDER BY e.eventname, rs.result;

Produces:

UNITED STATES   NORRIS HOLMWOOD SWIMMING        100 METER BUTTERFLY 49.82
ITALY           LEANDRO ROCCO   SWIMMING        100 METER BUTTERFLY 50.65
ARGENTINA       ORFEO SILVA     SWIMMING        100 METER BUTTERFLY 50.69
IRAN            HAMUND NAMAD    SWIMMING        100 METER BUTTERFLY 51.2
CHINA           MU KWOK         SWIMMING        100 METER BUTTERFLY 51.32
RUSSIA          MITRODFAN KRUPIN SWIMMING       100 METER BUTTERFLY 52.01
ARGENTINA       NICOLAO VARELA  TRACK AND FIELD 100 METER DASH      9.76
ITALY           STEFANO PAVONI  TRACK AND FIELD 100 METER DASH      9.98
UNITED STATES   ROBBY TURNBULL  TRACK AND FIELD 100 METER DASH      10.1
RUSSIA          IRINEY POLZIN   TRACK AND FIELD 100 METER DASH      10.35
CHINA           TU JIANG        TRACK AND FIELD 100 METER DASH      10.54
IRAN            SAKHR NAGI      TRACK AND FIELD 100 METER DASH      10.56
UNITED STATES   SCARLETT NOWELL SWIMMING        200 METER BACKSTROKE 116.32
IRAN            MALIKA NEJEM    SWIMMING        200 METER BACKSTROKE 116.88
etc...

How would I go about assigning each competitor a GOLD, SILVER, BRONZE, or NO MEDAL based only on the other results in the same event?


回答1:


use two variables

SELECT cy.countryname COUNTRY, c.firstname || ' ' || c.lastname "COMPETITOR", s.sportname, e.eventname EVENT, rs.result,
if(@curGame !=s.sportname,@curRank :=0,@curRank)  AS  setrank, @curRank := @curRank + 1 as rank,@curGame :=s.sportname as game_name
FROM COUNTRY cy
JOIN COMPETITOR c ON cy.COUNTRYID = c.COUNTRYID
JOIN RESULT rs ON c.competitorid = rs.competitorid
JOIN EVENT e ON rs.eventid = e.eventid
JOIN SPORT s ON e.sportid = s.sportid,(SELECT @curRank := 0,@curGame := "") r
ORDER BY e.eventname, rs.result;


来源:https://stackoverflow.com/questions/38407605/sql-ranking-multiple-groups

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!