Redshift ROW_NUMBER関数で行番号を表示する方法




行番号を表示するROW_NUMBER()関数

RedshiftにもMySQLと同じように行番号を数えるrownumのような関数があります。それがROW_NUMBERです。

使い方は下記で、ROW_NUMBER関数自体には引数は渡しません。

OVER関数

OVER関数の中にはPARTITION BY、GROUP BY、 ORDER BYを使用することができます。各関数で集計された行に対して1から順番に番号を割振ることができます。

select 
	id ,created_at, ROW_NUMBER() OVER(ORDER BY created_at ASC) AS row
FROM
	sample;

  id  |     created_at      | row
------+---------------------+-----
 1    | 2017-09-01 00:00:00 |   1
 2    | 2017-09-02 00:00:00 |   2
 3    | 2017-09-02 00:00:00 |   3
 4    | 2017-09-02 00:00:00 |   4

その他の行番号を採番する関数

Redshiftには他にもRANK()、DENSE_RANK()があり微妙に挙動が違います。

簡単に説明すると

  • ROW_NUMBER:並び順に同列があったとして値がかぶらないように1から順番に採番できる。
  • RANK:順位をつけるのに適しており、並び順に同列が3つある場合、次のレコードはプラス3の番号を採番される。
  • DENSE_RANK:RANKとは違い並び順が同じ場合は同じ番号を採番するが、次のレコードにはプラス1の番号が採番される

SQLで表すと下記のようになります。

SELECT
        x, 
        ROW_NUMBER() OVER(x),
        RANK()       OVER(x),
        DENSE_RANK() OVER(x)
FROM sample;

| x | ROW_NUMBER | RANK | DENSE_RANK |
|---|------------|------|------------|
| a |          1 |    1 |          1 |
| a |          2 |    1 |          1 |
| a |          3 |    1 |          1 |
| b |          4 |    4 |          2 |
| c |          5 |    5 |          3 |
| c |          6 |    5 |          3 |
| d |          7 |    7 |          4 |
| e |          8 |    8 |          5 |

参考

下記リンクがわかりやすく説明しているので参考にしてみてください。

The Difference Between ROW_NUMBER(), RANK(), and DENSE_RANK(

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です