按日期分组统计唯一客户数量的实现问题
按日期统计唯一访客数解决方案
需求回顾
给定数据表:
| client_id | action | date (datetime) |
|---|---|---|
| 1 | visit | 2024-10-10 10:00 |
| 1 | visit | 2024-10-10 12:00 |
| 1 | visit | 2024-10-10 13:00 |
| 2 | visit | 2024-10-10 13:00 |
需要按日期分组,统计每日唯一客户的访问数量,期望结果:{'date': '2024-10-10', "count_visits": 2}
Django ORM 实现代码
假设你的模型类名为VisitRecord,表中date (datetime)字段对应模型中的visit_datetime:
from django.db.models import Count from django.db.models.functions import TruncDate # 核心查询逻辑 queryset = VisitRecord.objects.filter(action="visit").annotate( date=TruncDate("visit_datetime") # 将datetime类型字段截断为日期部分 ).values("date").annotate( count_visits=Count("client_id", distinct=True) # 统计唯一客户数 ).values("date", "count_visits") # 转换为目标字典格式(含日期字符串转换) result = {} if queryset.exists(): raw_result = queryset.first() result = { "date": raw_result["date"].strftime("%Y-%m-%d"), "count_visits": raw_result["count_visits"] }
关键逻辑说明
TruncDate函数:将datetime类型的时间字段转换为纯日期,确保同一日期的所有记录被归为同一分组。Count(..., distinct=True):指定统计唯一的client_id,避免同一客户多次访问被重复计数。- 两次
values调用:第一次values("date")指定分组字段,第二次values("date", "count_visits")明确最终返回的字段结构。
执行后result即为你需要的格式:{'date': '2024-10-10', 'count_visits': 2}
内容的提问来源于stack exchange,提问作者Андрей
相关产品推荐
相关产品推荐

