显示奥运会金牌榜

 

问题

下面是某届奥运会的比赛数据。

国家表:

imagepng

运动员表记录了每位运动员所属的国家:

imagepng

比赛成绩表记录了所有的比赛结果:

imagepng

请列出本届奥运会的金牌榜,包括各个国家的金银铜牌数量,按金牌数排序,并给出名次,注意名次要考虑并列。

思路

大致思路:只要将运动员表中的国家字段替换为国家表中的记录,再将比赛结果表中的运动员字段也替换为相应记录,比赛成绩就可以直接和国家联系起来了,而后将比赛结果按国家分组,然后就很容易统计出各个国家的金银铜牌数量了。至于三个关键字排序的名次,只要直接以三个关键字组成的序列排序即可,而并列问题则可以使用 rank 函数解决。

  1. 首先将运动员表中的国家字段替换为国家表中相应的记录,比赛结果表中的运动员字段替换为运动员表中的相应记录。

  2. 将表按运动员的国家分组。

  3. 基于分组后的序列创建新序表,包含每个国家的名字、金银铜牌的数量统计,再预留一个名次字段,由于需要考虑并列,名次字段的值暂时留空,放到后面填写。

  4. 以金牌数、银牌数、铜牌数三个变量组成的序列排序,用 rank 函数填写排序名次。

  5. 最后依次按得到的名词作为关键字将表排好序即可。

代码

A
1 =file("C:\\txt\\Country.txt").import@t().keys(ID) 国家表
2 =file("C:\\txt\\Athlete.txt").import@t().keys(Athlete) 运动员表
3 =file("C:\\txt\\MatchResult.txt").import@t() 比赛结果表
4 >A2.switch(Country,A1), A3.switch(Athlete,A2) 先将运动员表和比赛结果表的字段替换为记录
5 =A3.group(Athlete.Country) 直接按运动员的国家分组
6 =A5.new(:Ranking, Athlete.Country.Country:Country, ~.count(Ranking==1):Gold,~.count(Ranking==2):Silver, ~.count(Ranking==3):Bronze) 创建新序表,同时求出每国金银铜牌数目并提取出国家名,并预留名次字段,值暂时留空
7 =A6.([Gold,Silver,Bronze]) 列出金银铜牌数的序列组成的序列
8 >A6.run(Ranking=A7.rank@z([Gold,Silver,Bronze])) 以金银铜牌数的序列算出每个国家的名次
9 =A6.sort(Ranking) 按名次排序表

结果

imagepng