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ś!