当前位置:网站首页>PostgreSQL server programming aggregation and grouping
PostgreSQL server programming aggregation and grouping
2022-07-04 22:20:00 【Hua Weiyun】
In any type of ORM in , polymerization (aggregation) Are the root causes of chaos , and Django So it is with . This document provides various examples , Demonstrates how to use Django Of ORM Group data (group) And aggregation (aggregation), But I decided to study from another angle .
In this paper , I will QuerySet and SQL Place... Side by side . If you like it best SQL Language , Then this is for you Django GROUP BY Quick reference table .

How to be in Django Middle group
To demonstrate different GROUP BY Inquire about , I will use Django built-in django.contrib.auth Models in applications .

How to calculate the number of rows
Let's calculate how many users we have :

Counting rows is very common , So much so that Django stay QuerySet It contains a function for it . And others QuerySet Different , We'll see it next count Return a number .
How to use aggregate functions
Django There are also two other ways to count the number of rows in the table .
We will start from aggregate Start :

In order to use aggregate We imported the aggregate function Count. under these circumstances , We use the name of the primary key column id To count all the rows in the table .
The result of aggregation is a dictionary , As shown below :

Return the default key name of the dictionary key yes id__count. It is best not to rely on this naming convention , Instead, provide your own name :

How to group
Use aggregate We get the aggregate function ( such as Count, Max, Sum) Results applied to the entire table , It's very useful , But usually we want to divide the records in the table into groups (group), Then apply the aggregate function to each group .
Now let's group according to the activity status of users , Then count the number of people in each group :

This time we used annotate. In order to produce GROUP BY The combination we use values and annotate:
values('is_active'): According to what groupannotate(total=Count('id')): Aggregate what
The return is is_active And the number of people in each state .
Order matters : Calling values Method used before annotate Aggregate function results are not added as comments .
How to filter query sets before grouping and aggregating
To apply the aggregate function to the filtered query set , It can be used anywhere in the query filter. for example , Only company employees are counted (staff) Active state count of :

How to sort query sets before using grouping aggregation
Like a filter , Can be used anywhere in the query statement order_by Sort the query set :

Be careful : You can check the fields in the table at the same time (is_active) And the fields generated after aggregation (total) Sort .
How to merge the results of multiple aggregate functions
Use multiple aggregate functions for the same set of data , Please add more than one comment at a time :

This query will generate the number of active and inactive users , And the last date that users in each group joined .
How to group by multiple fields
It's like executing multiple aggregate functions , We may also want to group by multiple fields in the table . for example , Group by activity status and personnel status :

The results of this query include and is_active,is_staff And the number of users in each group .
How to group by expression
GROUP BY Another common use case for is grouping by expression . for example , Calculate the number of users added each year :

Please note that , From us <field>__year Use the date of the special expression to get the year at the first call values(). The result of the query is a dict, The name of the key is date_joined__year.
Sometimes built-in expressions are not enough , You need to summarize more complex expressions . for example , Group users who have logged in after registration :

The expression here is quite complicated . We use annotate To build expressions , Then by referencing the expression in the call to the following pair , Mark it as GROUP BY key values(). So let's start here , It's exactly the same .
How to use conditional aggregation
Use conditional aggregation , You can only aggregate part of a group . When you have multiple aggregations , Conditions will come in handy . for example , Calculate the number of employees and non staff users according to the year of signing :

above SQL Statements from PostgreSQL, It is associated with SQLite Together is the only support at present FILTER Syntax shortcuts ( Officially known as “ Selective polymerization ”) The back end of the database . For other database backend ,ORM take CASE ... WHEN Instead of using .
How to use Having Filter the aggregation results
The HAVING Used to filter the results of aggregate functions , For example, find the year in which 100 More than users have registered :

How to press distinct grouping
For some aggregate functions , such as COUNT, Sometimes you want to count only different events . For example, count the number of different surnames in each user's activity status :

How to use aggregate fields to create expressions
Aggregating fields is usually just the first step in a larger problem . For example, unique last name by user activity status percentage How much is the :

first annotate() Define aggregate fields . The second kind annotate() Use aggregate functions to construct expressions .
How to group through various relationships
up to now , We only use data in a single model , But aggregation is often used across relationships . A simpler solution is a one-to-one or foreign key relationship . for example , Suppose we UserProfile And User There is a one-to-one relationship between , And we want to count users by profile type :

It's like GROUP BY The expression is the same , stay values Relationships used in will be grouped by this field . Please note that , The name of the user profile type in the result will be “ user_profile__type”.
How to group by many to many relationship
A more complex type of relationship is many to many relationship . For example, calculate how many groups each user is a member of :

A user can be a member of multiple groups . To calculate the number of groups the user belongs to , We are User Relevant names are used in the model “ Group ” . If the relevant name is not explicitly set (related_name), be Django It will automatically use format Generate name {related model model}_set. for example ,group_set.
Link to the original text :https://hakibenita.com/django-group-by-sql
original :KhakiBenita
translate : Big river dog
Related reading
Django QuerySet Query basis and skills . With her , Don't worry about SQL Yes .
Django Interacting with the database , You need to know 9 Tips
I hope I can understand it earlier Django Performance optimization techniques
Django Basics (24): aggregate and annotate Method use details and examples
边栏推荐
猜你喜欢

KDD2022 | 什么特征进行交互才是有效的?

可视化任务编排&拖拉拽 | Scaleph 基于 Apache SeaTunnel的数据集成

Locust性能测试 —— 环境搭建及使用

Éducation à la transmission du savoir | Comment passer à un test logiciel pour l'un des postes les mieux rémunérés sur Internet? (joindre la Feuille de route pour l'apprentissage des tests logiciels)

close系统调用分析-性能优化

A large number of virtual anchors in station B were collectively forced to refund: revenue evaporated, but they still owe station B; Jobs was posthumously awarded the U.S. presidential medal of freedo

BigFilter全局交易防重组件的介绍与应用

玩转gRPC—深入概念与原理

抖音实战~评论数量同步更新

Xiangjiang Kunpeng joined the shengteng Wanli partnership program and continued to write a new chapter of cooperation with Huawei
随机推荐
WebGIS framework -- kalrry
大厂的广告系统升级,怎能少了大模型的身影
Is it safe to open an account in the stock of Caicai college? Can you only open an account by digging money?
Telephone encryption, middle 4 is replaced by * * * *
电话加密,中间4为****代替
283. Moving zero-c and language assisted array method
close系统调用分析-性能优化
idea中pom.xml依赖无法导入
TCP protocol three times handshake process
Redis sentinel simply looks at the trade-offs between distributed high availability and consistency
Zhiyang innovation signed a cooperation agreement with Huawei to jointly promote the sustainable development of shengteng AI industry
BigFilter全局交易防重组件的介绍与应用
TCP协议三次握手过程
From repvgg to mobileone, including mobileone code
制作条形码的手机App推荐
Bookmark
并发网络模块化 读书笔记转
How can the advertising system of large factories be upgraded without the presence of large models
Jvm-Sandbox-Repeater的部署
机器学习笔记 - 互信息Mutual Information