SQL如何关联含相同Sport列的两表生成指定平均年龄字段新表
SQL实现方案
不需要拆分两次查询再做结果合并,使用条件聚合单次扫描原表就能生成你需要的三个字段,执行效率更高。
适配pysqldf环境的写法
你可以直接把查询结果赋值给新的DataFrame作为新表:
new_sport_age_table = pysqldf(""" SELECT Sport, AVG(Age) AS Avg_age, AVG(CASE WHEN Medal IN ('Gold', 'Silver', 'Bronze') THEN Age END) AS Avg_age_with_medal FROM athlete_events GROUP BY Sport ; """)
字段逻辑说明:
Avg_age:和你第一个查询的计算逻辑完全一致,统计对应项目所有参赛运动员的平均年龄Avg_age_with_medal:通过CASE WHEN先筛选出拿到金/银/铜牌的运动员记录,非获奖记录会被置为NULL,AVG函数计算时会自动忽略NULL值,最终结果和你第二个查询的获奖运动员平均年龄完全一致
标准SQL环境创建物理表写法
如果是在MySQL、PostgreSQL等支持CREATE TABLE AS语法的数据库中创建持久化物理表,可以直接执行以下语句:
CREATE TABLE sport_age_summary AS SELECT Sport, AVG(Age) AS Avg_age, AVG(CASE WHEN Medal IN ('Gold', 'Silver', 'Bronze') THEN Age END) AS Avg_age_with_medal FROM athlete_events GROUP BY Sport;
如果你一定要基于你写好的两个现有查询做关联生成结果(不推荐,需要两次扫描原表,性能更低),可以使用左连接写法:
SELECT t1.Sport, t1.Avg_age, t2.Avg_age_with_medal FROM ( SELECT Sport, AVG(Age) AS Avg_age FROM athlete_events GROUP BY Sport ) t1 LEFT JOIN ( SELECT Sport, AVG(Age) AS Avg_age_with_medal FROM athlete_events WHERE Medal IN ('Gold', 'Silver', 'Bronze') GROUP BY Sport ) t2 ON t1.Sport = t2.Sport
内容的提问来源于stack exchange,提问作者AnonymousBunny
相关产品推荐
相关产品推荐

