You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask SQLAlchemy使用group by clause按出生日期统计各年龄段用户数量

SQLAlchemy 实现年龄段用户数统计方案

前置说明

你当前的date of birth(简称DOB)字段为MM/DD/YYYY格式的字符串存储,需要先转成日期类型、计算年龄后再做分桶统计,以下是具体实现代码:

代码示例(以MySQL为例,其他数据库仅需替换日期相关函数)

假设用户表的ORM模型定义为User,DOB字段对应属性为dob:

from sqlalchemy import func, case
from sqlalchemy.orm import Session

# 1. 将字符串格式的DOB转为日期类型,计算用户当前年龄
dob_date = func.str_to_date(User.dob, '%m/%d/%Y')
user_age = func.timestampdiff(func.YEAR, dob_date, func.now())

# 2. 定义年龄段分桶规则,已调整边界避免25岁重复统计
age_bucket = case(
    (user_age.between(13, 18), "13-18"),
    (user_age.between(19, 25), "19-25"),
    (user_age.between(26, 40), "25-40"),
    (user_age.between(50, 80), "50-80"),
    else_="不匹配范围"
)

# 3. 执行分组统计查询
with Session(engine) as session:
    stats = session.query(
        age_bucket.label("年龄段"),
        func.count(User.id).label("用户数")
    ).group_by(age_bucket).all()

# 4. 转换为需求的字典格式
result_dict = {item.年龄段: item.用户数 for item in stats if item.年龄段 != "不匹配范围"}

不同数据库适配调整

  • PostgreSQL:将func.str_to_date替换为func.to_date(User.dob, 'MM/DD/YYYY'),年龄计算改为func.extract('year', func.age(dob_date))
  • SQLite:日期转换改为func.date(User.dob, '%m/%d/%Y'),年龄计算改为func.strftime('%Y', 'now') - func.strftime('%Y', dob_date)
  • 若DOB字段本身就是DATE/DATETIME类型存储,可直接删除日期转换步骤,直接用User.dob计算年龄

内容的提问来源于stack exchange,提问作者Atif Shafi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:24:01