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

Sådan får du rækkenummer i PostgreSQL

PostgreSQL giver dig mulighed for at få specifikt rækkenummer for dine data til rangering, rapportering og dataanalyse. Sådan får du rækkenummer i PostgreSQL. Du kan bruge det til yderligere analyse baseret på række-id i PostgreSQL.

Sådan får du rækkenummer i PostgreSQL

Sådan får du et specifikt rækkenummer i PostgreSQL. Vi vil se på, hvordan man får rækkenummer ved hjælp af ROW_NUMBER() vinduesfunktion, der er tilgængelig i PostgreSQL 8.4+ samt brug af almindelig SQL til PostgreSQL <8.4.

Lad os sige, at du har følgende tabel salg(ordre_dato,udsalg)

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

postgres=# insert into sales values('2020-04-01',210),
           ('2020-04-02',125),('2020-04-03',150),('2020-04-04',230),
           ('2020-04-05',200),('2020-04-10',220),('2020-04-06',25),
           ('2020-04-07',215),('2020-04-08',300),('2020-04-09',250);

postgres=# select * from sales;
 order_date | sale
------------+------
 2020-04-01 |  210
 2020-04-02 |  125
 2020-04-03 |  150
 2020-04-04 |  230
 2020-04-05 |  200
 2020-04-10 |  220
 2020-04-06 |   25
 2020-04-07 |  215
 2020-04-08 |  300
 2020-04-09 |  250

Bonus Læs:Sådan beregnes procent i PostgreSQL

Sådan får du rækkenummer i PostgreSQL ved hjælp af ROW_NUMBER()

Siden PostgreSQL 8.4 kan du nemt vise rækkenummer i PostgreSQL ved hjælp af ROW_NUMBER() funktion. Her er SQL-forespørgslen for at få række-id i PostgreSQL.

postgres=# select row_number() over(), *
           from   sales;
 row_number | order_date | sale
------------+------------+------
          1 | 2020-04-01 |  210
          2 | 2020-04-02 |  125
          3 | 2020-04-03 |  150
          4 | 2020-04-04 |  230
          5 | 2020-04-05 |  200
          6 | 2020-04-10 |  220
          7 | 2020-04-06 |   25
          8 | 2020-04-07 |  215
          9 | 2020-04-08 |  300
         10 | 2020-04-09 |  250

I ovenstående SQL-forespørgsel bruger vi row_number() vinduesfunktion til at generere rækkenummer for hver række. Vi bruger også over() til at fortælle PostgreSQL at vise rækkenummer for alle rækker uden nogen bestilling.

Bonus Læs:Sådan beregnes median i PostgreSQL

Hvis du vil bestille rækker, før du genererer rækkenumre, kan du tilføje en ORDER BY-klausul i OVER(), som vist nedenfor

postgres=# select row_number() over(order by sale), *
           from   sales;
 row_number | order_date | sale
------------+------------+------
          1 | 2020-04-06 |   25
          2 | 2020-04-02 |  125
          3 | 2020-04-03 |  150
          4 | 2020-04-05 |  200
          5 | 2020-04-01 |  210
          6 | 2020-04-07 |  215
          7 | 2020-04-10 |  220
          8 | 2020-04-04 |  230
          9 | 2020-04-09 |  250
         10 | 2020-04-08 |  300

Du kan ikke bruge WHERE-sætning i ROW_NUMBER eller OVER() vinduesfunktioner. Så hvis du vil filtrere data, før du genererer rækkenumre, skal du bruge WHERE-årsagen i en underforespørgsel, som vist nedenfor

postgres=# select row_number() over(order by sale), *
           from  ( select * from sales where sale>100) filtered_sales;
 row_number | order_date | sale
------------+------------+------
          1 | 2020-04-02 |  125
          2 | 2020-04-03 |  150
          3 | 2020-04-05 |  200
          4 | 2020-04-01 |  210
          5 | 2020-04-07 |  215
          6 | 2020-04-10 |  220
          7 | 2020-04-04 |  230
          8 | 2020-04-09 |  250
          9 | 2020-04-08 |  300

Du kan også få rækkenummer i PostgreSQL ved at bruge gener_series. Det er dog tilrådeligt ikke at generere række-id ved hjælp af generate_series da den ikke er skalerbar.

Bonuslæser:Sådan udfyldes manglende datoer i PostgreSQL ved hjælp af generate_series

Sådan får du rækkenummer i PostgreSQL (<8.4) uden ROW_NUMBER()

Hvis du bruger PostgreSQL <8.4, så row_number() vinduesfunktionen er muligvis ikke tilgængelig i den. I så fald skal du få rækkenummer i PostgreSQL ved hjælp af en selv-join. Her er forespørgslen til det.

postgres=# SELECT    count(*) rownum, foo.*
           FROM      sales foo
           JOIN      sales bar
              ON (foo.order_date <= bar.order_date)
           GROUP BY  foo.order_date, foo.sale
           ORDER BY  rownum
           ;
 rownum | order_date | sale
--------+------------+------
      1 | 2020-04-10 |  220
      2 | 2020-04-09 |  250
      3 | 2020-04-08 |  300
      4 | 2020-04-07 |  215
      5 | 2020-04-06 |   25
      6 | 2020-04-05 |  200
      7 | 2020-04-04 |  230
      8 | 2020-04-03 |  150
      9 | 2020-04-02 |  125
     10 | 2020-04-01 |  210

Når du har fået rækkenummer i PostgreSQL, kan du bruge et PostgreSQL-rapporteringsværktøj til at rapportere dine data i en tabel som vist nedenfor og dele med dit team.

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. Hvad er MySQL-ækvivalenten til STUFF() i SQL Server?

  2. Lad MySQL-brugere oprette databaser, men tillad kun adgang til deres egne databaser

  3. Hvad er MariaDB Enterprise, og hvordan administreres det med ClusterControl?

  4. Sådan rettes Microsoft SQL Server Error 926? - Løst