本文首發於微信公眾號: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() 方法的繼承和修改、主鍵自增和欄位更新的操作。
如果想獲取更多相關文章,可掃碼關注閱讀: