寻求简化SQL聚合查询方案:无需临时表计算人均病例数
无临时表实现Covid病例统计查询
核心思路
要获取每个国家的最新total_cases并计算cases_per_capita,关键是先定位每个国家的最新日度记录,同时利用Population在同一国家内数值固定的特点,直接聚合取值即可。
方案1:使用窗口函数(推荐)
窗口函数可以直接对每个国家的记录按日期排序,标记出最新的那条,无需临时表:
SELECT Location AS 国家名称, total_cases AS 最新累计病例数, ROUND(total_cases / MAX(Population) OVER (PARTITION BY Location), 6) AS cases_per_capita FROM ( SELECT Continent, Location, Population, total_cases, ROW_NUMBER() OVER (PARTITION BY Location ORDER BY 日期列 DESC) AS rn FROM CovidCasesAndDeaths ) t WHERE rn = 1 ORDER BY Location;
- 内层子查询用
ROW_NUMBER()按国家分组、日期倒序排序,给每条记录标记行号rn,行号1就是该国家的最新记录 - 外层筛选
rn=1的记录,同时用MAX(Population) OVER (PARTITION BY Location)确保取到对应国家的人口数(因为同一国家人口固定,用MIN/MAX/直接取都可以) ROUND()用来控制cases_per_capita的小数位数,可按需调整
方案2:子查询关联最新日期
如果不熟悉窗口函数,也可以先获取每个国家的最新日期,再关联原表获取对应数据:
SELECT c.Location AS 国家名称, c.total_cases AS 最新累计病例数, ROUND(c.total_cases / c.Population, 6) AS cases_per_capita FROM CovidCasesAndDeaths c INNER JOIN ( SELECT Location, MAX(日期列) AS latest_date FROM CovidCasesAndDeaths GROUP BY Location ) l ON c.Location = l.Location AND c.日期列 = l.latest_date ORDER BY c.Location;
- 子查询先按国家分组,得到每个国家的最新日期
latest_date - 关联原表,匹配国家和最新日期,就能拿到对应的最新
total_cases - 因为同一国家同一日期的
Population值唯一,直接用c.Population计算即可
内容的提问来源于stack exchange,提问作者Reynal
相关产品推荐
相关产品推荐

