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を使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。