PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So erhalten Sie die erste Zeile pro Gruppe in PostgreSQL

Manchmal müssen Sie möglicherweise die erste Zeile pro Gruppe in PostgreSQL abrufen. Dies kann eine schwierige Abfrage mit einfachem SQL sein. Glücklicherweise bietet PostgreSQL Fensterfunktionen für solche Datenanalysen. So erhalten Sie die erste Zeile pro Gruppe in PostgreSQL.

So erhalten Sie die erste Zeile pro Gruppe in PostgreSQL

Hier sind die Schritte, um die erste Zeile pro Gruppe in PostgreSQL zu erhalten.

Angenommen, Sie haben die folgende Tabelle product_sales die produktweise Verkäufe enthält.

postgres=# create table product_sales(
             product varchar(255),
             order_date date, 
             sale int);

postgres=# insert into product_sales(product,order_date, sale)
           values('A','2020-05-01',250),
           ('B','2020-05-01',350),
           ('C','2020-05-01',1250),
           ('A','2020-05-02',450),
           ('B','2020-05-02',650),
           ('C','2020-05-02',1050),
           ('A','2020-05-03',150),
           ('B','2020-05-03',250),
           ('C','2020-05-03',1850);

postgres=# select * from product_sales;
 product | order_date | sale
---------+------------+------
 A       | 2020-05-01 |  250
 B       | 2020-05-01 |  350
 C       | 2020-05-01 | 1250
 A       | 2020-05-02 |  450
 B       | 2020-05-02 |  650
 C       | 2020-05-02 | 1050
 A       | 2020-05-03 |  150
 B       | 2020-05-03 |  250
 C       | 2020-05-03 | 1850

Angenommen, Sie möchten die erste Zeile in jeder Gruppe erhalten, d. h. für jedes Produkt. Mit der FENSTERFUNKTION können Sie ganz einfach den ersten Datensatz für jede Gruppe abrufen.

Bonuslektüre:So erhalten Sie die Zeilennummer in PostgreSQL

So erhalten Sie die erste Zeile pro Gruppe in PostgreSQL

Hier ist die SQL-Abfrage, um den ersten Datensatz pro Gruppe zu erhalten. Zuerst weisen wir jedem Datensatz pro Gruppe eine Zeilennummer zu.

postgres=# select
            *,
           row_number() over (partition by product order by order_date asc) 
           as row_number
           from product_sales;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-01 |  250 |          1
 A       | 2020-05-02 |  450 |          2
 A       | 2020-05-03 |  150 |          3
 B       | 2020-05-01 |  350 |          1
 B       | 2020-05-02 |  650 |          2
 B       | 2020-05-03 |  250 |          3
 C       | 2020-05-01 | 1250 |          1
 C       | 2020-05-02 | 1050 |          2
 C       | 2020-05-03 | 1850 |          3

In der obigen Abfrage verwenden wir row_number() Funktion, um jedem Datensatz eine Zeilennummer zuzuweisen. Da wir für jede Gruppe eine separate Nummerierung der Zeilen benötigen, verwenden wir die PARTITION WINDOW FUNCTION. Wir weisen Postgresql an, die Zeilen nach jedem Produkt zu partitionieren , das heißt, und sortieren Sie die Zeilen für jede Gruppe nach order_date

Als Nächstes müssen wir nur das obige Ergebnis verwenden, um Zeilen auszuwählen, in denen row_number=1

ist
postgres=# select *
           from (
            select
                *,
               row_number() over (partition by product order by order_date asc) 
               as row_number
             from product_sales
             ) temp where row_number=1;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-01 |  250 |          1
 B       | 2020-05-01 |  350 |          1
 C       | 2020-05-01 | 1250 |          1

Die obige Abfrage gibt Ihnen den ersten Datensatz in jeder Gruppe.

Bonus-Lesetext:So berechnen Sie das Perzentil in PostgreSQL

So erhalten Sie die letzte Zeile pro Gruppe in PostgreSQL

Wenn Sie die letzte Zeile pro Gruppe in PostgreSQL erhalten möchten, ändern Sie einfach die Sortierreihenfolge in der PARTITION-Klausel der obigen Abfrage von aufsteigend in absteigend.

postgres=# select *
           from (
           select
             *,
             row_number() over (partition by product order by order_date desc) 
             as row_number
             from product_sales
           ) temp where row_number=1;
 product | order_date | sale | row_number
---------+------------+------+------------
 A       | 2020-05-03 |  150 |          1
 B       | 2020-05-03 |  250 |          1
 C       | 2020-05-03 | 1850 |          1

Hoffentlich können Sie den ersten Eintrag in jeder Gruppe in PostgreSQL erhalten.

Ubiq macht es einfach, Daten innerhalb von Minuten zu visualisieren und in Echtzeit-Dashboards zu überwachen. Probieren Sie es noch heute aus!