当前位置:网站首页>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
边栏推荐
- Enabling digital economy Fuxin software attends the BRICs high level Forum on Sustainable Development
- 迷失在Mysql的锁世界
- 阿里推出新品牌“瓴羊”,致力成为“数字化领头羊”
- 时空预测3-graph transformer
- 我在linux里面 通过调用odspcmd 查询数据库信息 怎么静默输出 就是只输出值 不要这个
- QT - plot other problems
- 1807. 替换字符串中的括号内容
- close系统调用分析-性能优化
- Telephone encryption, middle 4 is replaced by * * * *
- Bookmark
猜你喜欢
close系统调用分析-性能优化
Radio and television Wuzhou signed a cooperation agreement with Huawei to jointly promote the sustainable development of shengteng AI industry
QT - double buffer plot
2022-07-04:以下go语言代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { fmt.Pri
Concurrent optimization summary
Ascendex launched Walken (WLKN) - an excellent and leading "walk to earn" game
Why do you have to be familiar with industry and enterprise business when doing Bi development?
【Acwing】第58场周赛 题解
达梦数据凭什么被称为国产数据库“第一股”?
抖音实战~评论数量同步更新
随机推荐
Cadre WebGIS - kalrry
HDU - 2859 Phalanx(DP)
智洋创新与华为签署合作协议,共同推进昇腾AI产业持续发展
[acwing] solution of the 58th weekly match
高中物理:直线运动
Enabling digital economy Fuxin software attends the BRICs high level Forum on Sustainable Development
HDU - 2859 Phalanx(DP)
HUAWEI nova 10系列发布 华为应用市场筑牢应用安全防火墙
B站大量虚拟主播被集体强制退款:收入蒸发,还倒欠B站;乔布斯被追授美国总统自由勋章;Grafana 9 发布|极客头条
Bookmark
并列图的画法,多排多列
Short video system source code, click the blank space of the screen, the keyboard does not automatically stow
并发优化总结
传智教育|如何转行互联网高薪岗位之一的软件测试?(附软件测试学习路线图)
迷失在Mysql的锁世界
Bookmark
微服务--开篇
《命令行上的数据科学第二版》校对活动重新启动
力扣98:验证二叉搜索树
new IntersectionObserver 使用笔记