PostgreSQLではグループごとに最初の行を取得する必要がある場合があります。これは、プレーンSQLを使用した難しいクエリになる可能性があります。幸いなことに、PostgreSQLはそのようなデータ分析のためのウィンドウ関数を提供します。 PostgreSQLでグループごとに最初の行を取得する方法は次のとおりです。
PostgreSQLでグループごとに最初の行を取得する方法
PostgreSQLでグループごとに最初の行を取得する手順は次のとおりです。
次のテーブルがあるとしますproduct_sales 製品ごとの売上が含まれています。
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
各グループ、つまり各製品の最初の行を取得するとします。 WINDOW FUNCTIONを使用すると、各グループの最初のレコードを簡単に取得できます。
ボーナスリード:PostgreSQLで行番号を取得する方法
PostgreSQLでグループごとに最初の行を取得する方法
グループごとに最初のレコードを取得するSQLクエリは次のとおりです。まず、グループごとに各レコードに行番号を割り当てます。
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
上記のクエリでは、 row_number()を使用します 各レコードに行番号を割り当てる関数。グループごとに個別の行番号が必要なため、PARTITIONWINDOWFUNCTIONを使用します。 Postgresqlに各製品ごとに行を分割するように指示します つまり、各グループの行を order_dateで並べ替えます。
次に、上記の結果を使用して、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
上記のクエリにより、各グループの最初のレコードが得られます。
ボーナスリード:PostgreSQLでパーセンタイルを計算する方法
PostgreSQLでグループごとに最後の行を取得する方法
PostgreSQLでグループごとに最後の行を取得する場合は、上記のクエリのPARTITION句の並べ替え順序を昇順から降順に変更するだけです。
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
うまくいけば、PostgreSQLの各グループで最初のレコードを取得できます。
Ubiqを使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。