如何按各国家ALL行总数排序且保持同国家数据聚合
解决方案
你可以通过先计算每个国家的总港口数并将其作为排序依据,关联到所有结果行中,实现按国家总港口数排序且同一国家数据聚合的需求。
修改后的查询语句如下:
WITH country_totals AS ( -- 计算每个国家的总港口数,作为全局排序的核心依据 SELECT country, COUNT(*) AS total_harbors FROM bigquery-public-data.geo_international_ports.world_port_index GROUP BY country ), port_counts AS ( -- 统计每个国家各港口尺寸的数量 SELECT country, harbor_size, COUNT(*) AS hb_count FROM bigquery-public-data.geo_international_ports.world_port_index GROUP BY country, harbor_size UNION ALL -- 添加每个国家的"ALL"汇总行 SELECT country, 'ALL' AS harbor_size, total_harbors AS hb_count FROM country_totals ) SELECT pc.country, pc.harbor_size, pc.hb_count FROM port_counts pc JOIN country_totals ct ON pc.country = ct.country -- 排序逻辑:先按国家总港口数降序,再确保同国家行聚合,最后让"ALL"行排在国家数据最前面,其余按港口数量降序 ORDER BY ct.total_harbors DESC, pc.country, CASE WHEN pc.harbor_size = 'ALL' THEN 0 ELSE 1 END, pc.hb_count DESC;
逻辑说明
country_totals临时表:单独计算每个国家的总港口数,后续用来做全局排序的基准。port_counts临时表:合并了"国家+港口尺寸"的细分统计行,以及"国家+ALL"的汇总行。- 最终查询通过关联总港口数表,实现全局按总数量排序;同时通过国家字段保证同国家数据聚合,用
CASE语句让每个国家的"ALL"行优先展示。
内容的提问来源于stack exchange,提问作者Szczepando
相关产品推荐
相关产品推荐

