sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでグループごとに最初の行を取得する方法

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

    1. SQLでテキストを小文字に変更する方法

    2. TSQLまたはGUIを使用してSQLServerでデータベースを作成する方法-SQLServer/TSQLチュートリアルパート24

    3. コマンドライン引数を使用してPostgreSQL.sqlファイルを実行します

    4. 暗号化されたストアドプロシージャの本文をSSMSで表示するにはどうすればよいですか?