行番号を表示する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にブロックチェーンエンジニアとして入社。
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す