HAVING与GROUP BY用法疑问:如何用MAX(year)筛选最新年份数据
单条SQL实现各行业组最新年份碳足迹统计优化方案
问题原因
你之前的HAVING MAX(year) = year条件无效,核心原因是GROUP BY industry_group, year后,每个分组内的year是单一固定值,MAX(year)必然等于该分组的year,因此这个条件会匹配所有年份的分组,无法筛选出每个行业的最新年份数据。
优化方案
方案一:窗口函数实现(推荐,高效简洁)
利用窗口函数给每个行业的年份分组排序,直接筛选最新年份的统计结果:
SELECT industry_group, count_industry, total_industry_footprint FROM ( SELECT industry_group, COUNT(company) AS count_industry, ROUND(SUM(carbon_footprint_pcf), 1) AS total_industry_footprint, -- 按行业分组,年份倒序编号,最新年份为1 ROW_NUMBER() OVER (PARTITION BY industry_group ORDER BY year DESC) AS rn FROM product_emissions GROUP BY industry_group, year ) t WHERE rn = 1 ORDER BY total_industry_footprint DESC;
该方案适用于支持窗口函数的数据库(如MySQL 8.0+、PostgreSQL、SQL Server等),无需额外关联,性能更优。
方案二:子查询关联实现(兼容性强)
先获取每个行业的最新年份,再关联原表统计对应年份的数据:
SELECT p.industry_group, COUNT(p.company) AS count_industry, ROUND(SUM(p.carbon_footprint_pcf), 1) AS total_industry_footprint FROM product_emissions p -- 子查询获取每个行业的最新年份 INNER JOIN ( SELECT industry_group, MAX(year) AS latest_year FROM product_emissions GROUP BY industry_group ) t ON p.industry_group = t.industry_group AND p.year = t.latest_year GROUP BY p.industry_group, p.year ORDER BY total_industry_footprint DESC;
该方案兼容性更好,适合不支持窗口函数的低版本数据库。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

