当前位置:网站首页>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
边栏推荐
- 开户哪家券商比较好?网上开户安全吗
- Apachecn translation, proofreading, note sorting activity progress announcement 2022.7
- ACM Multimedia 2022 | 视觉语言预训练模型中社会偏见的反事实衡量和消除
- Mysql root 账号如何重置密码
- Which securities company has the lowest Commission for opening an account online? I want to open an account. Is it safe to open an account online
- Spatiotemporal prediction 3-graph transformer
- 服务线上治理
- Force buckle_ Palindrome number
- 并发优化总结
- Representation of confidence interval
猜你喜欢
HUAWEI nova 10系列发布 华为应用市场筑牢应用安全防火墙
Convolutional neural network model -- lenet network structure and code implementation
É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)
From repvgg to mobileone, including mobileone code
【米哈游2023届秋招】开启【校招唯一专属内推码EYTUC】
El tree combined with El table, tree adding and modifying operations
LOGO特训营 第一节 鉴别Logo与Logo设计思路
Nat. Commun.| 机器学习对可突变的治疗性抗体的亲和力和特异性进行共同优化
UML图记忆技巧
el-tree结合el-table,树形添加修改操作
随机推荐
Cadre WebGIS - kalrry
【Acwing】第58场周赛 题解
Is it safe to open an account in the stock of Caicai college? Can you only open an account by digging money?
时空预测3-graph transformer
KDD2022 | 什么特征进行交互才是有效的?
Redis sentinel simply looks at the trade-offs between distributed high availability and consistency
i. Mx6ull driver development | 24 - platform based driver model lights LED
凭借了这份 pdf,最终拿到了阿里,字节,百度等八家大厂 offer
283. 移动零-c与语言辅助数组法
常用的开源无代码测试工具
傳智教育|如何轉行互聯網高薪崗比特之一的軟件測試?(附軟件測試學習路線圖)
QT - plot other problems
广电五舟与华为签署合作协议,共同推进昇腾AI产业持续发展
30余家机构联合发起数字藏品行业倡议,未来会如何前进?
new IntersectionObserver 使用笔记
Machine learning notes mutual information
PHP short video source code, thumb animation will float when you like it
i.MX6ULL驱动开发 | 24 - 基于platform平台驱动模型点亮LED
力扣2_1480. 一维数组的动态和
The proofreading activity of data science on the command line second edition was restarted