PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment obtenir le numéro de ligne dans PostgreSQL

PostgreSQL vous permet d'obtenir un numéro de ligne spécifique pour vos données à des fins de classement, de création de rapports et d'analyse de données. Voici comment obtenir le numéro de ligne dans PostgreSQL. Vous pouvez l'utiliser pour une analyse plus approfondie basée sur l'ID de ligne dans PostgreSQL.

Comment obtenir le numéro de ligne dans PostgreSQL

Voici comment obtenir un numéro de ligne spécifique dans PostgreSQL. Nous verrons comment obtenir le numéro de ligne en utilisant la fonction de fenêtre ROW_NUMBER() disponible dans PostgreSQL 8.4+ ainsi qu'en utilisant du SQL brut pour PostgreSQL <8.4.

Disons que vous avez le tableau suivant sales(order_date,sale)

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

Lecture bonus :comment calculer le centile dans PostgreSQL

Comment obtenir le numéro de ligne dans PostgreSQL à l'aide de ROW_NUMBER()

Depuis PostgreSQL 8.4, vous pouvez facilement afficher le numéro de ligne dans PostgreSQL en utilisant la fonction ROW_NUMBER(). Voici la requête SQL pour obtenir l'ID de ligne dans 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

Dans la requête SQL ci-dessus, nous utilisons la fonction de fenêtre row_number() pour générer le numéro de ligne pour chaque ligne. Nous utilisons également over() pour dire à PostgreSQL d'afficher le numéro de ligne pour toutes les lignes sans aucun ordre.

Lecture bonus :Comment calculer la médiane dans PostgreSQL

Si vous souhaitez ordonner les lignes avant de générer les numéros de ligne, vous pouvez ajouter une clause ORDER BY dans OVER(), comme indiqué ci-dessous

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

Vous ne pouvez pas utiliser la clause WHERE dans les fonctions de fenêtre ROW_NUMBER ou OVER(). Donc, si vous souhaitez filtrer les données avant de générer des numéros de ligne, vous devez utiliser WHERE cause dans une sous-requête, comme indiqué ci-dessous

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

Vous pouvez également obtenir le numéro de ligne dans PostgreSQL en utilisant generate_series. Cependant, il est conseillé de ne pas générer d'identifiant de ligne à l'aide de generate_series puisqu'il n'est pas évolutif.

Lecture bonus :comment remplir les dates manquantes dans PostgreSQL à l'aide de generate_series

Comment obtenir le numéro de ligne dans PostgreSQL (<8.4) sans ROW_NUMBER()

Si vous utilisez PostgreSQL <8.4, alors row_number() la fonction de fenêtre peut ne pas y être disponible. Dans ce cas, vous devez obtenir le numéro de ligne dans PostgreSQL à l'aide d'une auto-jointure. Voici la requête correspondante.

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

Après avoir obtenu le numéro de ligne dans PostgreSQL, vous pouvez utiliser un outil de rapport PostgreSQL pour rapporter vos données dans un tableau comme indiqué ci-dessous, et les partager avec votre équipe.

Si vous souhaitez créer des graphiques, des tableaux de bord et des rapports à partir de la base de données PostgreSQL, vous pouvez essayer Ubiq. Nous offrons un essai gratuit de 14 jours.