sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan beregnes månedlig vækst i PostgreSQL

Måned over måned vækst er en nyttig forretningsmetrik KPI for måned over måned sammenligning af salg, tilmeldinger osv. Vi vil beregne månedlig procentvis vækst via SQL-forespørgsel, da der ikke er nogen PostgreSQL-funktion til det. Sådan beregner du månedlig vækst i PostgreSQL.

Sådan beregnes månedlig vækst i PostgreSQL

Lad os sige, at du har en tabel, der indeholder månedlige salg kaldet salgsdata(måned, udsalg)

postgres=# create table sales_data(month int,sale int);

postgres=# insert into sales_data(month,sale) values(1,2021),
           (2,2102),(3,2150),(4,2312),(5,2425);

postgres=# select * from sales_data;
 month | sale
-------+------
     1 | 2021
     2 | 2102
     3 | 2150
     4 | 2312
     5 | 2425

Her er SQL-forespørgslen til at beregne månedlig procentvis vækst i salget i PostgreSQL.

postgres=# select month,sum(sale) as current_sale,
                lag(sum(sale), 1) over (order by month) as previous_month_sale,
                (100 * (sum(sale) - lag(sum(sale), 1) over (order by month)) / lag(sum(sale), 1) over 
                (order by month)) || '%' as growth
                from sales_data
                group by 1
                order by 1;
 month | current_sale | previous_month_sale | growth
-------+--------------+---------------------+--------
     1 |         2021 |                     |
     2 |         2102 |                2021 | 4%
     3 |         2150 |                2102 | 2%
     4 |         2312 |                2150 | 7%
     5 |         2425 |                2312 | 4%

I ovenstående forespørgsel bruger vi LAG-vinduefunktionen til at beregne tidligere måneds salg og bruger den til at beregne måned over måned vækst i PostgreSQL. LAG giver dig mulighed for at hente rækken, der kommer før den nuværende række, med en defineret offset, som er 1 i vores tilfælde.

Bonuslæse: Sådan opretter du pivottabel i PostgreSQL

I de fleste tilfælde vil du have daglige salgsdata i stedet for månedlige tal. I dette tilfælde aggregerer vi det først til månedlige salgstal og anvender derefter ovenstående SQL-forespørgsel til at beregne væksten måned over måned i PostgreSQL.

Lad os sige, at du har daglige salgsdata.

postgres=# create sales (order_date date, sale int);

postgres=# insert into sales values('2020-01-01',20),
           ('2020-01-02',25),('2020-01-03',15),('2020-01-04',30),
           ('2020-02-05',20),('2020-02-10',20),('2020-02-06',25),
           ('2020-03-07',15),('2020-03-08',30),('2020-03-09',20);

postgres=# select * from sales;
 order_date | sale | 
------------+------+
 2020-01-01 |   20 |
 2020-01-02 |   25 |
 2020-01-03 |   15 |
 2020-01-04 |   30 |
 2020-02-05 |   20 |
 2020-02-10 |   20 |
 2020-02-06 |   25 |
 2020-03-07 |   15 |
 2020-03-08 |   30 |
 2020-03-09 |   20 |

Her er SQL-forespørgslen til at beregne månedlig vækstrate i PostgreSQL

postgres=# select month,sum(sale) as current_sale,
           lag(sum(sale), 1) over (order by month) as previous_month_sale,
           round((100 * (sum(sale) - lag(sum(sale), 1) over (order by month)) / lag(sum(sale), 1) over 
           (order by month)),2) || '%' as growth
           from (select to_char(order_date,'Mon') as month,
           sum(sale) as sale
           from sales
           group by 1 ) sales_data
           group by 1
           order by 1;
 month | current_sale | previous_month_sale | growth
-------+--------------+---------------------+---------
 Feb   |           65 |                     |
 Jan   |           90 |                  65 | 38.46%
 Mar   |           65 |                  90 | -27.78%

I ovenstående forespørgsel samler vi de daglige salgsdata til månedlige værdier (med fed ) og brug derefter tidligere forespørgsel.

Du kan også filtrere dine data ved hjælp af en WHERE-klausul, før du beregner vækst fra måned til måned i PostgreSQL.

postgres=# select month,sum(sale) as current_sale,
           lag(sum(sale), 1) over (order by month) as previous_month_sale,
           round((100 * (sum(sale) - lag(sum(sale), 1) over (order by month)) / lag(sum(sale), 1) over 
           (order by month)),2) || '%' as growth
           from (select to_char(order_date,'Mon') as month,
           sum(sale) as sale
           from sales 
           WHERE condition
           group by 1 ) sales_data
           group by 1
           order by 1;

Når du har beregnet vækst måned over måned i PostgreSQL, kan du bruge et rapporteringsværktøj til at plotte disse data på et søjlediagram eller dashboard og dele dem med dit team. Her er et eksempel på et søjlediagram, der viser vækst i procent måned over måned, oprettet ved hjælp af Ubiq.

Hvis du vil oprette diagrammer, dashboards og rapporter fra PostgreSQL-databasen, kan du prøve Ubiq. Vi tilbyder en 14-dages gratis prøveperiode.

  1. Optimer gruppevis maksimal forespørgsel

  2. MYSQLi-fejl:Brugeren har allerede mere end 'max_user_connections' aktive forbindelser

  3. Sådan sletter du data fra Elastisearch

  4. TO_CHAR af en Oracle PL/SQL TABLE-type