sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man får radnummer i PostgreSQL

PostgreSQL låter dig få specifikt radnummer för dina data för rankning, rapportering och dataanalys. Så här får du radnummer i PostgreSQL. Du kan använda den för ytterligare analys baserat på rad-ID i PostgreSQL.

Hur får man radnummer i PostgreSQL

Så här får du ett specifikt radnummer i PostgreSQL. Vi kommer att titta på hur man får radnummer med ROW_NUMBER() fönsterfunktion tillgänglig i PostgreSQL 8.4+ samt att använda vanlig SQL för PostgreSQL <8.4.

Låt oss säga att du har följande tabell försäljning(orderdatum, rea)

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:Hur man beräknar procent i PostgreSQL

Hur får du radnummer i PostgreSQL med ROW_NUMBER()

Sedan PostgreSQL 8.4 kan du enkelt visa radnummer i PostgreSQL med ROW_NUMBER() funktion. Här är SQL-frågan för att få rad-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 ovanstående SQL-fråga använder vi row_number()-fönsterfunktionen för att generera radnummer för varje rad. Vi använder också over() för att tala om för PostgreSQL att visa radnummer för alla rader utan någon ordning.

Bonus Läs:Hur man beräknar median i PostgreSQL

Om du vill beställa rader innan du genererar radnummer kan du lägga till en ORDER BY-sats i OVER(), som visas nedan

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 inte använda WHERE-satsen i ROW_NUMBER eller OVER() fönsterfunktioner. Så om du vill filtrera data innan du genererar radnummer måste du använda WHERE-orsak i en underfråga, som visas nedan

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 också få radnummer i PostgreSQL med generera_serier. Det är dock tillrådligt att inte generera rad-id med generate_series eftersom det inte är skalbart.

Bonusläs:Hur man fyller i saknade datum i PostgreSQL med generation_series

Hur får man radnummer i PostgreSQL (<8.4) utan ROW_NUMBER()

Om du använder PostgreSQL <8.4, då row_number() fönsterfunktionen kanske inte är tillgänglig i den. I så fall måste du få radnummer i PostgreSQL med hjälp av en självanslutning. Här är frågan om 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ått radnummer i PostgreSQL kan du använda ett PostgreSQL-rapporteringsverktyg för att rapportera dina data i en tabell enligt nedan, och dela med ditt team.

Om du vill skapa diagram, instrumentpaneler och rapporter från PostgreSQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.

  1. Hur kan jag schemalägga ett jobb för att köra en SQL-fråga dagligen?

  2. rs.last() ger Ogiltig operation för enbart forward-resultatuppsättning:last

  3. SQL - Hitta saknade int-värden i mestadels ordnade sekventiella serier

  4. Alternativ lösning till DCount och DLookup med MS SQL Server Backend