Query to rank rows in groups

前端 未结 3 847
既然无缘
既然无缘 2021-01-20 10:57

I\'m using Apache Derby 10.10.

I have a list of participants and would like to calculate their rank in their country, like this:

|        Country |           


        
3条回答
  •  终归单人心
    2021-01-20 11:30

    Consider a non-windows function SQL query that uses a correlated aggregate count subquery. Because the group column (Country.name) is not in same table as the rank criteria (Participant.points), we need to run same joins in the subquery but rename table aliases to properly compare inner and outer queries.

    Now of course, in a perfect world that would be it but we must now account for tied points. Therefore, another very similar subquery (for tie breaker) is used to be added to first subquery. This second nested query matches inner and outer query's Country.name and Participant.points but ranks by alphabetical order of Participant.name.

    SELECT
        Country.name AS Country,
        Participant.name AS Participant,
        Participant.points,
        (SELECT Count(*) + 1
           FROM Country subC
          INNER JOIN Team subT
                  ON subC.id = subT.country_id
          INNER JOIN Participant subP
                  ON subT.id = subP.team_id
          WHERE subC.name = Country.name
            AND subP.points < Participant.points) 
    
         +
    
        (SELECT Count(*)
           FROM Country subC
          INNER JOIN Team subT
                  ON subC.id = subT.country_id
          INNER JOIN Participant subP
                  ON subT.id = subP.team_id
          WHERE subC.name = Country.name
            AND subP.points = Participant.points
            AND subP.name < Participant.name)  As country_rank
    
    FROM Country
    INNER JOIN Team
            ON Country.id = Team.country_id
    INNER JOIN Participant
            ON Team.id = Participant.team_id
    ORDER BY Country.name, Participant.points;
    

提交回复
热议问题