当前位置:网站首页>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 group

  • annotate(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 Basics (12): Put dry goods late at night .QuerySet Features and advanced usage skills , How to reduce database access , Save memory , Improve website performance .

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

原网站

版权声明
本文为[Hua Weiyun]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207042145246919.html