在业务数据分析工作中,按区域维度聚合数据是非常高频的需求,比如统计各省份的销售额、各城市的用户注册量、不同经纬度范围内的订单分布等。这类需求的核心是通过SQL的分组逻辑,将地理位置相关的数据按照指定区域规则归类后完成统计计算。

基础区域维度聚合:按固定区域字段分组
如果数据表中已经存储了明确的区域标识字段,比如province(省份)、city(城市),直接使用GROUP BY语句配合聚合函数即可完成统计。以下示例统计各省份的订单总量和总销售额:
-- 订单表结构示例:order_id, province, amount, create_time
SELECT
province,
COUNT(order_id) AS order_count,
SUM(amount) AS total_amount
FROM order_table
WHERE create_time >= '2024-01-01' AND create_time < '2024-07-01'
GROUP BY province
ORDER BY order_count DESC;
如果需要同时按省份和城市两级维度聚合,只需要在GROUP BY后添加对应字段即可:
SELECT
province,
city,
COUNT(order_id) AS order_count,
SUM(amount) AS total_amount
FROM order_table
GROUP BY province, city;
结合经纬度的区域聚合:按地理范围统计
当数据表中没有明确的区域字段,只有经纬度信息lng(经度)、lat(纬度)时,需要先通过经纬度范围划分区域,再进行聚合。以下示例统计落在北纬30度到32度、东经110度到112度范围内的订单数量:
-- 订单表包含lng(经度)、lat(纬度)字段
SELECT
COUNT(order_id) AS order_count,
SUM(amount) AS total_amount
FROM order_table
WHERE lat >= 30 AND lat <= 32
AND lng >= 110 AND lng <= 112;
如果需要划分多个经纬度网格区域统计,可以通过计算经纬度所属区间生成临时区域标识,再进行分组:
-- 按1度*1度的网格划分区域,统计每个网格的订单量
SELECT
FLOOR(lat) AS lat_grid,
FLOOR(lng) AS lng_grid,
COUNT(order_id) AS order_count
FROM order_table
GROUP BY FLOOR(lat), FLOOR(lng)
ORDER BY order_count DESC;
常用聚合函数与注意事项
区域聚合场景中常用的聚合函数包括:
- COUNT():统计区域内记录总数,如订单数、用户数
- SUM():统计区域内数值总和,如销售额、访问量
- AVG():统计区域内数值平均值,如客单价、平均响应时间
- MAX()/MIN():统计区域内数值的最大最小值,如最高销售额、最低温度
需要注意,GROUP BY后面的字段必须出现在SELECT语句中(聚合函数内的字段除外),同时如果需要对聚合后的结果筛选,要使用HAVING子句而不是WHERE:
-- 筛选出订单量超过100的省份
SELECT
province,
COUNT(order_id) AS order_count
FROM order_table
GROUP BY province
HAVING COUNT(order_id) > 100;
总结
SQL按区域维度聚合数据的核心逻辑是先明确区域的划分规则,再通过GROUP BY完成分组,最后配合聚合函数得到统计结果。如果区域是固定字段直接分组即可,如果是经纬度数据则需要先通过范围计算生成区域标识再分组。实际业务中可以根据需求灵活组合过滤条件、排序规则和聚合函数,满足不同的统计场景需求。