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

PostgreSQLで行番号を取得する方法

    PostgreSQLでは、ランク付け、レポート、およびデータ分析のために、データの特定の行番号を取得できます。 PostgreSQLで行番号を取得する方法は次のとおりです。 PostgreSQLの行IDに基づいてさらに分析するために使用できます。

    PostgreSQLで行番号を取得する方法

    PostgreSQLで特定の行番号を取得する方法は次のとおりです。 PostgreSQL 8.4以降で使用可能なROW_NUMBER()ウィンドウ関数とPostgreSQL<8.4用のプレーンSQLを使用して行番号を取得する方法を見ていきます。

    次のテーブルがあるとしますsales(order_date、sale)

    postgres=# create table sales(order_date date,sale int);
    
    postgres=# insert into sales values('2020-04-01',210),
               ('2020-04-02',125),('2020-04-03',150),('2020-04-04',230),
               ('2020-04-05',200),('2020-04-10',220),('2020-04-06',25),
               ('2020-04-07',215),('2020-04-08',300),('2020-04-09',250);
    
    postgres=# select * from sales;
     order_date | sale
    ------------+------
     2020-04-01 |  210
     2020-04-02 |  125
     2020-04-03 |  150
     2020-04-04 |  230
     2020-04-05 |  200
     2020-04-10 |  220
     2020-04-06 |   25
     2020-04-07 |  215
     2020-04-08 |  300
     2020-04-09 |  250
    

    ボーナスリード:PostgreSQLでパーセンタイルを計算する方法

    ROW_NUMBER()を使用してPostgreSQLで行番号を取得する方法

    PostgreSQL 8.4以降、ROW_NUMBER()関数を使用してPostgreSQLの行番号を簡単に表示できます。 PostgreSQLで行IDを取得するためのSQLクエリは次のとおりです。

    postgres=# select row_number() over(), *
               from   sales;
     row_number | order_date | sale
    ------------+------------+------
              1 | 2020-04-01 |  210
              2 | 2020-04-02 |  125
              3 | 2020-04-03 |  150
              4 | 2020-04-04 |  230
              5 | 2020-04-05 |  200
              6 | 2020-04-10 |  220
              7 | 2020-04-06 |   25
              8 | 2020-04-07 |  215
              9 | 2020-04-08 |  300
             10 | 2020-04-09 |  250
    

    上記のSQLクエリでは、row_number()ウィンドウ関数を使用して、各行の行番号を生成します。また、over()を使用して、順序なしですべての行の行番号を表示するようにPostgreSQLに指示します。

    ボーナスリード:PostgreSQLで中央値を計算する方法

    行番号を生成する前に行を並べ替える場合は、以下に示すように、OVER()にORDERBY句を追加できます

    postgres=# select row_number() over(order by sale), *
               from   sales;
     row_number | order_date | sale
    ------------+------------+------
              1 | 2020-04-06 |   25
              2 | 2020-04-02 |  125
              3 | 2020-04-03 |  150
              4 | 2020-04-05 |  200
              5 | 2020-04-01 |  210
              6 | 2020-04-07 |  215
              7 | 2020-04-10 |  220
              8 | 2020-04-04 |  230
              9 | 2020-04-09 |  250
             10 | 2020-04-08 |  300
    

    ROW_NUMBERまたはOVER()ウィンドウ関数でWHERE句を使用することはできません。したがって、行番号を生成する前にデータをフィルタリングする場合は、以下に示すように、サブクエリでWHEREcauseを使用する必要があります

    postgres=# select row_number() over(order by sale), *
               from  ( select * from sales where sale>100) filtered_sales;
     row_number | order_date | sale
    ------------+------------+------
              1 | 2020-04-02 |  125
              2 | 2020-04-03 |  150
              3 | 2020-04-05 |  200
              4 | 2020-04-01 |  210
              5 | 2020-04-07 |  215
              6 | 2020-04-10 |  220
              7 | 2020-04-04 |  230
              8 | 2020-04-09 |  250
              9 | 2020-04-08 |  300
    

    generate_seriesを使用してPostgreSQLで行番号を取得することもできます。ただし、 generate_seriesを使用して行IDを生成しないことをお勧めします。 スケーラブルではないため。

    ボーナスリード:generate_seriesを使用してPostgreSQLで欠落している日付を埋める方法

    ROW_NUMBER()を使用せずにPostgreSQL(<8.4)で行番号を取得する方法

    PostgreSQL <8.4を使用している場合は、 row_number() ウィンドウ機能が使用できない場合があります。その場合、自己結合を使用してPostgreSQLで行番号を取得する必要があります。これがそのクエリです。

    postgres=# SELECT    count(*) rownum, foo.*
               FROM      sales foo
               JOIN      sales bar
                  ON (foo.order_date <= bar.order_date)
               GROUP BY  foo.order_date, foo.sale
               ORDER BY  rownum
               ;
     rownum | order_date | sale
    --------+------------+------
          1 | 2020-04-10 |  220
          2 | 2020-04-09 |  250
          3 | 2020-04-08 |  300
          4 | 2020-04-07 |  215
          5 | 2020-04-06 |   25
          6 | 2020-04-05 |  200
          7 | 2020-04-04 |  230
          8 | 2020-04-03 |  150
          9 | 2020-04-02 |  125
         10 | 2020-04-01 |  210
    

    PostgreSQLで行番号を取得したら、PostgreSQLレポートツールを使用して、以下に示すようなテーブルでデータをレポートし、チームと共有できます。

    PostgreSQLデータベースからチャート、ダッシュボード、レポートを作成したい場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。

    1. SQLServerのLIMIT10..20

    2. MySQLVARCHARの長さとUTF-8

    3. SQLiteのCount()結果から重複を削除

    4. postgres:ユーザーをスーパーユーザーにアップグレードしますか?