select
    case
        when age < 25 or age is null then '25岁以下'
        else '25岁及以上'
    end as age_cut,
    count(*) as number
from 
    user_profile
group by
    age_cut
order by
    case
         when age_cut = '25岁以下' then 1
        else 2
    end;

代码结构分析

1. 数据分组(CASE WHEN + GROUP BY

sql

CASE
    WHEN age < 25 OR age IS NULL THEN '25岁以下'
    ELSE '25岁及以上'

  • 作用:将用户按年龄分段。如果 age 小于 25 或 age 为 NULL,标记为 "25 岁以下"。否则(age >= 25),标记为 "25 岁及以上"。
  • 注意age IS NULL 的用户会被归类到 "25 岁以下",需根据业务需求确认是否合理。

2. 统计数量(COUNT(*)

sql

END AS age_cut
COUNT(*) AS number

  • 作用:统计每个分组的用户数量。COUNT(*) 会统计所有记录(包括 age 为 NULL 的记录)。

3. 分组依据(GROUP BY age_cut

sql

GROUP BY age_cut

  • 作用:根据 age_cut 的值(即分段结果)分组,确保统计结果按年龄段分开。

4. 排序(ORDER BY + CASE

sql

ORDER BY
    CASE
        WHEN age_cut = '25岁以下' THEN 1
        ELSE 2
    END

  • 作用:自定义排序规则,确保结果按 "25 岁以下" 在前、"25 岁及以上" 在后的顺序展示。通过 CASE 返回数值(1 或 2),实现固定顺序排序。

关键点说明

  1. 处理 NULL 值:age IS NULL 的用户被归类到 "25 岁以下"。若需单独处理 NULL,可新增一个分组(如 "年龄未知")。
  2. 分组与排序的一致性:GROUP BY 和 ORDER BY 都使用 age_cut,确保分组和排序逻辑统一。
  3. 性能优化:若表数据量较大,可在 age 字段上创建索引,加速过滤和分组操作。