Django笔记十七之group by 分组用法总结
本文首发于微信公众号:Hunter后端
原文链接:Django笔记十七之group by 分组用法总结
这篇笔记介绍 Django 里面 model 的 group by 对应的一些操作。
用到的 Model 如下:
class TestModel(models.Model):
num = models.IntegerField()
user_id = models.IntegerField()
create_date = models.DateField()
我们写入几条数据:
TestModel.objects.create(num=78, user_id=1, create_date="2022-01-01")
TestModel.objects.create(num=99, user_id=1, create_date="2022-01-01")
TestModel.objects.create(num=87, user_id=1, create_date="2022-01-08")
TestModel.objects.create(num=66, user_id=2, create_date="2022-01-01")
TestModel.objects.create(num=54, user_id=2, create_date="2022-01-08")
TestModel.objects.create(num=77, user_id=2, create_date="2022-01-16")
本篇笔记的目录如下:
- distinct 单个字段
- distinct 多个字段
- count 字段去重后总数
- sum 某个字段总和
- group by 分组统计 count
- group by 分组统计 max
- group by 分组统计 sum
- group by 分组统计 count + distinct
1、distinct 单个字段
现在我们需要 user_id 这个字段进行去重处理,获取一个去重后的 user_id 的列表
使用 SQL 的话,大致如下:
select distinct user_id from blog_test;
使用 QuerySet 语句则是:
TestModel.objects.values_list("user_id", flat=True).distinct()
2、distinct 多个字段
假设需要对 user_id 和 create_date 这两个字段做去重处理,
使用 SQL 语句如下:
select distinct user_id, create_date from blog_test;
对应的 QuerySet 语句:
TestModel.objects.values("user_id").distinct()
3、count 字段去重后总数
比如我们想查看 2022-01-01 这天有多少不同 user_id 值的数据
select count(distinct user_id) from blog_test where create_date = '2022-01-01';
对应的 QuerySet 为:
TestModel.objects.filter(create_date='2022-01-01').values("user_id").distinct().count()
4、sum 某个字段总和
我们想查看 2022-01-01 这天 num 字段的数据的总和有多少:
select sum(num) from blog_test where create_date = '2022-01-01';
Django 语句:
from django.db.models import Sum
TestModel.objects.filter(create_date='2022-01-01').aggregate(sum_num=Sum('num'))
# 返回值为
# {'sum_num': 243}
5、group by 分组统计 count
按照日期统计 user_id 的总数:
select create_date, count(user_id) from blog_test group by create_date;
Django 语句:
from django.db.models import Count
TestModel.objects.values("create_date").annotate(count=Count("user_id"))
6、group by 分组统计 max
按照日期计算每一天最大的 num 的数据:
select create_date, max(num) from blog_test group by create_date;
Django 语句:
TestModel.objects.values("create_date").annotate(max_num=Max("num"))
7、group by 分组统计 sum
按照日期计算 num 的总数:
select create_date, sum(num) from blog_test group by create_date;
Django 语句:
from django.db.models import Sum
TestModel.objects.values("create_date").annotate(sum_num=Sum("num"))
8、group by 分组统计 count + distinct
如果是对需要对 user_id 进行去重处理的统计,SQL 如下:
select create_date, count(distinct user_id) from blog_test group by create_date;
Django 语句:
TestModel.objects.values("create_date").annotate(count=Count("user_id", distinct=True))
以上就是本篇笔记全部内容,接下来会是几个深入一点的知识点的介绍,比如一个 Model 示例 save() 方法的继承和修改、主键自增和字段更新的操作。
如果想获取更多相关文章,可扫码关注阅读:

Django笔记十七之group by 分组用法总结的更多相关文章
- SQL中group by的用法
group by即按照给定字段对结果集进行分组,从字面意义上理解就是根据"by"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个" ...
- 总结 group by 的用法
今天用实例总结一下group by的用法. 归纳一下:group by:ALL ,Cube,RollUP,Compute,Compute by 创建数据脚本 Create Table SalesInf ...
- 带你了解数据库中group by的用法
前言 本章主要介绍数据库中group by的用法,也是我们在使用数据库时非常基础的一个知识点.并且也会涉及Join的使用,关于Join的用法,可以看我写的上一篇文章:带你了解数据库中JOIN的用法如有 ...
- Django笔记 —— Admin(Django站点管理界面)
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- Django笔记 —— 模型
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- Django笔记 —— 模板
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- 浅析MySQL使用 GROUP BY 分组聚合与细分聚合
原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7521278.html: 若有错误,请评论指出,谢谢! 1. 聚合函数(Aggregate Function ...
- Group by的用法
Group by的用法 GROUP BY 语句根据一个或多个列对结果集进行分组.在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. Group by用法: SELECT column_ ...
- Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...
- SQL Server中的group by(分组)
参考网址: https://blog.csdn.net/tswc_byy/article/details/81909052 sql 查询不必需和聚合函数一起使用 ,通常来说一般是要和聚合函数一起使用来 ...
随机推荐
- JS计算加减乘除出现多位小数的解决方法
function add(arg1, arg2){ let decima1, decima2, differ, m; try { decima1 = arg1.toString().split('.' ...
- json中有List集合时,转换List集合内元素的时间格式
1 public class User implements Serializable { 2 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ...
- Android 自定义SeekBar (二)
一.前言 本文在 上节 的基础上,讲解自定义拖动条的实现思路. 二.思路 先在res/values文件夹下,自定义控件属性: <?xml version="1.0" enco ...
- CatDCGAN项目复现与对抗网络初识
CatDCGAN项目复现与对抗网络初识 作者 CarpVexing 日期 100521 禁止转载 目录 CatDCGAN项目复现与对抗网络初识 引言 CatDCGAN项目基本信息 复现项目的准备工作 ...
- MySQL代替in之临时表
如果我们正常的使用IN去查询 SELECT * FROM a JOIN b ON a.id = b.id WHERE b.tag_id IN (1,2,3,4,5,6) 这种因为in里面的参数是连续的 ...
- Oracle查询优化经验
1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (低效,执行时间156 ...
- NFS存储安装配置
一.NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种, 它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客 户 ...
- 微信小程序中如何识别银行卡和身份证
识别银行卡云函数card2/index.js: const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRE ...
- 解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning
这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型.这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品.和前两章微调LM和全部冻结的pro ...
- jdk8 stream部分排序方法
List<类> list; 代表某集合 //返回 对象集合以类属性一升序排序 list.stream().sorted(Comparator.comparing(类::属性一)); ...