如何为奥运累计奖牌表补全所有国家各届的奖牌记录
我正尝试创建一张表统计奥运会各参赛国的所有奖牌获得情况。
我从维基百科*爬虫获取(scraped)*了数据,基础格式如下:
| Year | Country_Name | Host_city | Host_Country | Gold | Silver | Bronze |
|---|---|---|---|---|---|---|
| 1986 | 146 | Los Angeles | United States | 41 | 32 | 30 |
| 1986 | 67 | Los Angeles | United States | 12 | 12 | 12 |
后续还有更多同格式数据。
我已经核验了部分年份的数据,准确性符合要求。注意这里的Country_Name字段实际存储的是国家ID,我另外单独建了Country_ID表来做ID和国家名称的映射,表结构如下:
| Country_ID | Country_Name |
|---|---|
| 1986 | 1 |
| 1986 | 2 |
目前进展还算顺利。我现在需要创建一张新表,存储每届奥运会所有国家的累计奖牌数。现在已经实现了参赛国的数据写入,这里给个1896年奥运会的实现示例:
INSERT INTO Cumultative_Medals_by_Year(Country_ID, Year, Culmutative_Gold, Culmutative_Silver, Culmutative_Bronze, Total_Medals) SELECT a.Country_Name, a.Year, SUM(a.Gold) As Cumultative_Gold, SUM(a.Silver) As Cumultative_Silver, SUM(a.Bronze) As Cumultative_Bronze, SUM(a.Gold) + SUM(a.Silver) + SUM(a.Bronze) AS Total_Medals FROM Country_Medals a Where a.Year >= 1896 AND Year < 1900 Group By a.Country_Name, a.Year
执行后得到的表结构如下:
| Country_ID | Year | Cumultative_Gold | Cumultative_Silver | Cumultative_Bronze | Total_Medals |
|---|---|---|---|---|---|
| 6 | 1986 | 2 | 0 | 0 | 5 |
| 7 | 1986 | 2 | 1 | 2 | 5 |
| 35 | 1986 | 1 | 2 | 3 | 6 |
| 46 | 1986 | 5 | 4 | 2 | 11 |
| 49 | 1986 | 6 | 5 | 2 | 13 |
| 51 | 1986 | 2 | 3 | 2 | 7 |
| 52 | 1986 | 10 | 18 | 19 | 47 |
| 58 | 1986 | 2 | 1 | 3 | 6 |
| 85 | 1986 | 1 | 0 | 1 | 2 |
| 131 | 1986 | 1 | 2 | 0 | 3 |
| 146 | 1986 | 11 | 7 | 2 | 20 |
如果要添加其他届次的数据,只需要修改WHERE条件的时间范围即可,比如添加1900届数据的条件为Where a.Year >= 1900 AND Year < 1904,对应SQL如下:
INSERT INTO Cumultative_Medals_by_Year(Country_ID, Year, Culmutative_Gold, Culmutative_Silver, Culmutative_Bronze, Total_Medals) SELECT a.Country_Name, a.Year, SUM(a.Gold) As Cumultative_Gold, SUM(a.Silver) As Cumultative_Silver, SUM(a.Bronze) As Cumultative_Bronze, SUM(a.Gold) + SUM(a.Silver) + SUM(a.Bronze) AS Total_Medals FROM Country_Medals a Where a.Year >= 1900 AND Year < 1904 Group By a.Country_Name, a.Year
这样表中的数据就会逐步累加。
但我现在还需要给1896年这一届补充所有未参赛国家的记录,拿到所有国家的全量数据。比如国家1在1896年奥运会没有获得任何奖牌,我也需要把对应的记录写入表中,哪怕求和结果是NULL也没关系,后续我会把NULL统一更新为0。
我做这个的需求背景是要制作动画条形竞速图(Animated Bar Chart Race),现有数据会导致部分国家的条形在图表中消失:比如美国未参加1980年奥运会,它的条形就会在1980年的节点消失,直到1984年参赛才会重新出现;再比如苏联,它的奖牌总数位列全球第二,仅次于美国,但1988年后不再参赛,它的条形就会在1988年节点后彻底消失。如果每届奥运会都保留所有国家的奖牌记录,就能避免这个问题。
内容的提问来源于stack exchange,提问作者Ramon

