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
相关产品推荐
相关产品推荐

