PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak uzyskać pierwszy wiersz na grupę w PostgreSQL?

Czasami może być konieczne uzyskanie pierwszego wiersza na grupę w PostgreSQL. To może być trudne zapytanie przy użyciu zwykłego SQL. Na szczęście PostgreSQL oferuje funkcje okienkowe do takiej analizy danych. Oto jak uzyskać pierwszy wiersz na grupę w PostgreSQL.

Jak uzyskać pierwszy wiersz na grupę w PostgreSQL

Oto kroki, aby uzyskać pierwszy wiersz na grupę w PostgreSQL.

Załóżmy, że masz następującą tabelę product_sales który zawiera sprzedaż produktową.

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

Załóżmy, że chcesz uzyskać pierwszy wiersz w każdej grupie, czyli dla każdego produktu. Możesz łatwo uzyskać pierwszy rekord dla każdej grupy za pomocą FUNKCJI WINDOW.

Przeczytaj bonus:Jak uzyskać numer wiersza w PostgreSQL

Jak uzyskać pierwszy wiersz na grupę w PostgreSQL

Oto zapytanie SQL, aby uzyskać pierwszy rekord na grupę. Najpierw przypisujemy numer wiersza dla każdego rekordu na grupę.

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

W powyższym zapytaniu używamy row_number() funkcja przypisywania numeru wiersza dla każdego rekordu. Ponieważ potrzebujemy osobnej numeracji wierszy dla każdej grupy, używamy FUNKCJI PARTYCJI WINDOW. Mówimy Postgresql, aby podzielił wiersze według każdego produktu , czyli posortuj wiersze dla każdej grupy według data_zamówienia

Następnie wystarczy użyć powyższego wyniku, aby wybrać wiersze, w których row_number=1

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

Powyższe zapytanie da ci pierwszy rekord w każdej grupie.

Przeczytaj bonus:Jak obliczyć percentyl w PostgreSQL

Jak uzyskać ostatni wiersz na grupę w PostgreSQL

Jeśli chcesz uzyskać ostatni wiersz na grupę w PostgreSQL, po prostu zmień kolejność sortowania w klauzuli PARTITION powyższego zapytania z rosnącej na malejącą.

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

Mam nadzieję, że możesz uzyskać pierwszy rekord w każdej grupie w PostgreSQL.

Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wkładka wielorzędowa z obietnicą pg

  2. Kolumna zapytania SQL nie istnieje błąd

  3. Tworzenie PostgreSQL dla Windows, część 3

  4. Ewolucja tolerancji błędów w PostgreSQL

  5. Jak zmienić bazę danych na postgresql za pomocą Symfony 2.0?