美文网首页Django笔记
Django笔记十七之group by 分组用法总结

Django笔记十七之group by 分组用法总结

作者: vv安的浅唱 | 来源:发表于2023-03-06 21:29 被阅读0次

这篇笔记介绍 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")

本篇笔记的目录如下:

  1. distinct 单个字段
  2. distinct 多个字段
  3. count 字段去重后总数
  4. sum 某个字段总和
  5. group by 分组统计 count
  6. group by 分组统计 max
  7. group by 分组统计 sum
  8. 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 分组用法总结

相关文章

  • mysql group by 用法解析(详细)

    MySQL最常用分组聚合函数 group by 用法解析 group by 必须出现在where之后 order ...

  • MySQL--查询

    group By 将数据根据指定字段进行分组,之后进行统计 用法:group by 字段名,这个不会显示所有,只保...

  • 数据分组

    group by关键字 作用:对查询结果进行分组处理 用法: 1.分组之后,不能将除分组字段之外的字段放在sele...

  • SQL的GROUP BY用法小结

    SQL的GROUP BY用法小结 利用聚合函数进行分组 使用COUNT()、AVG()、MIN()、MAX()等聚...

  • 2019-11-23_单表查询_分组

    说到分组查询,当然想到的是group by,根据字面group就明白是分组的意思,group by后面加分组条件,...

  • mysql小书---分组和函数

    分组--group by 简单--select 字段 from 表 group by 字段 加分组函数--...

  • MySQL 基础语法

    分组数据 数据分组 分组是在SELECT语句的GROUP BY子句中建立的。 GROUP BY子句可以包含任意数目...

  • mysql_group by

    group by使用了group by 分组,写法:select 分组的字段, 聚合行数 from 表 g...

  • 24《MySQL 教程》 GROUP BY分组

    本小节介绍如何对查询结果使用 GROUP BY 分组,GROUP BY 分组是对指定一个或多个字段分组,使用分组可...

  • group by和having

    自我理解:未分组前,是 行 为单位group by分组后,是 组 为单位 既然group by分组了,oracle...

网友评论

    本文标题:Django笔记十七之group by 分组用法总结

    本文链接:https://www.haomeiwen.com/subject/lufvldtx.html