在业务数据分析中,按年龄段分组统计是高频需求,比如统计不同年龄段用户的活跃度、不同年龄层员工的薪资分布等。使用SQL的FLOOR函数可以快速完成年龄的区间计算,再结合分组语句就能高效得到统计结果。

FLOOR函数的基本用法
FLOOR函数的作用是返回小于或等于指定数值的最大整数,也就是向下取整。它的语法非常简单,不同数据库中的用法基本一致:
-- FLOOR函数基本语法 FLOOR(数值表达式) -- 示例:对浮点数向下取整 SELECT FLOOR(25.8) AS result; -- 返回25 SELECT FLOOR(30.1) AS result; -- 返回30 SELECT FLOOR(-12.3) AS result; -- 返回-13
结合年龄计算实现区间划分
假设我们需要按10岁为一个区间划分年龄,比如0-9岁、10-19岁、20-29岁这样的区间。我们可以先计算年龄除以区间步长的商,再用FLOOR函数取整,最后乘以步长就能得到区间的起始值。
比如步长为10,年龄25岁计算逻辑是FLOOR(25/10)*10,结果是20,对应20-29岁区间;年龄39岁计算FLOOR(39/10)*10得到30,对应30-39岁区间。
计算区间起始值的示例代码
-- 假设age是用户年龄字段,步长为10
SELECT
age,
FLOOR(age / 10) * 10 AS age_start,
FLOOR(age / 10) * 10 + 9 AS age_end
FROM user_table;
完整的年龄段分组统计实现
完成区间计算后,我们可以将区间起始值作为分组依据,配合聚合函数完成统计。以下是统计各年龄段用户人数的完整示例:
-- 统计各年龄段(10岁为步长)的用户人数
SELECT
CONCAT(FLOOR(age / 10) * 10, '-', FLOOR(age / 10) * 10 + 9) AS age_range,
COUNT(*) AS user_count
FROM user_table
WHERE age IS NOT NULL -- 排除年龄为空的记录
GROUP BY FLOOR(age / 10) * 10
ORDER BY FLOOR(age / 10) * 10 ASC;
不同步长的调整方式
如果需要调整区间步长,只需要修改除法和乘法的数值即可。比如按5岁为步长划分,代码调整如下:
-- 按5岁为步长统计年龄段人数
SELECT
CONCAT(FLOOR(age / 5) * 5, '-', FLOOR(age / 5) * 5 + 4) AS age_range,
COUNT(*) AS user_count
FROM user_table
WHERE age IS NOT NULL
GROUP BY FLOOR(age / 5) * 5
ORDER BY FLOOR(age / 5) * 5 ASC;
注意事项
- 需要确保年龄字段是数值类型,如果是字符串类型需要先通过
CAST函数转换,比如CAST(age_str AS UNSIGNED) - 如果年龄存在负数或者异常值,建议先通过WHERE条件过滤,避免统计结果失真
- 部分数据库对FLOOR函数的参数类型有要求,如果传入的是整数除法,可能需要先转换为浮点型,比如
FLOOR(age * 1.0 / 10) * 10
扩展:结合其他聚合函数统计
除了统计人数,还可以结合SUM、AVG等聚合函数统计其他指标,比如统计各年龄段的用户总消费金额:
-- 统计各年龄段用户总消费和平均消费
SELECT
CONCAT(FLOOR(age / 10) * 10, '-', FLOOR(age / 10) * 10 + 9) AS age_range,
COUNT(*) AS user_count,
SUM(consumption_amount) AS total_consumption,
AVG(consumption_amount) AS avg_consumption
FROM user_table
WHERE age IS NOT NULL
GROUP BY FLOOR(age / 10) * 10
ORDER BY FLOOR(age / 10) * 10 ASC;