You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:42:17