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 查询不必需和聚合函数一起使用 ,通常来说一般是要和聚合函数一起使用来 ...
随机推荐
- 冲刺总结-day7
完成任务:前端设计 设计系统前端,利用html和css对登录页面和进入系统操作界面进行界面化设计,使系统看起来美观.简洁. 一.设计思路 利用HTML对整个网页页面进行布局和设计内容,使用CSS对每一 ...
- vue-封装组件-结合vant实现点击按钮弹出泡泡(Popover)事件控制多个泡泡出现时,弹出对应的泡泡
<template> <div class="sale-share-box"> <span class="sale-share-btn&qu ...
- Linux(CentOS)安装脚本
此文以CentOS为例,乌班图的是有区别的,请参照https://www.cnblogs.com/takako_mu/p/11725733.html. 安装.Net Core (能访问外网的情况下采用 ...
- VBA类模块完全教程(www.accessoft.com软件网)
这份礼物送给现在想学习类知识或曾经学过但因为各种原因没有"修成正果"的朋友,我期望的结果是这篇文章后,您可以在类模块中像在标准模块中写代码一样熟练,我也期望不至于太乏味而使您没有耐 ...
- 007使用IDEA开发
007使用IDEA开发 1.什么叫IDE? 集成开发环境(IDE,Integrated Development Environment)是用于提供程序开发环境的应用程序,一般包括代码编辑器.编译器.调 ...
- Java集合框架个人总结
Java集合框架个人总结 集合主要分为两大类:①单列集合Collection ②双列集合Map 集合存储的都是引用类型,不可是基础类型,如果保存基础类型需要用包装类. 1.Collection接口 ...
- Edge 访问网站强制HTTPS
edge://net-internals/#hsts 1)開啟Edge chromium 瀏覽器,輸入edge://net-internals/#hsts,開啟設定介面2)找到 Delete doma ...
- asyncio基础用法
说明:需要Python 3.7+ 1.并发运行两个coroutine,写法一: 用Task import asyncio import time async def say_after(delay, ...
- 使用php将字典格式的字符串转为array
例: 原字符串为 $a = '{"errcode":0,"errmsg":"ok","msgid":1472671765 ...
- 计网学习笔记三 MAC与LAN
在上一讲中,我们学习了链路层可以提供的服务:framing,link access,reliable delivery,error detection&correction.这一讲我们从lin ...