データベーステーブルに連番で数字を付けたいと思うケースは多々あります。
例えばソートをした場合など、通しで連番がついていないケースでは非常に扱い難いデータとなる可能性も。
そんな時に連番を振れるクエリがあれば便利ですよね?
そこで今回は「連番」に的を絞って記事にしていきたいと思います。
これをマスターすればいちいちデータ全体を見直す必要がなくなるので是非とも覚えましょう!
連番を振る
SQLには「ROW_NUMBER」という関数が存在します。
このROW_NUMBER関数はSELECTした結果に連番を振ることが出来る関数となっています。
使い方
早速ROW_NUMBER関数の使い方について説明していきます。
まず記述についてですが、基本的には次のように行います。
ROW_NUMBER() OVER(ORDER BY [column_name] ASC/DESC)
連番は「ROW_NUMBER関数 + OVER句 + ORDER BY」で範囲を指定して並び替えることで解決します。
それでは実際にコードで見てみましょう。
まず今回使用するテーブルの内容です。
Name Color StandardCost Size SellStartDate ----------------------------------- -------- --------------------- ----- ----------------------- HL Road Frame - Black, 58 Black 1059.3100 58 2002-06-01 00:00:00.000 HL Road Frame - Red, 58 Red 1059.3100 58 2002-06-01 00:00:00.000 Sport-100 Helmet, Red Red 13.0863 NULL 2005-07-01 00:00:00.000 Sport-100 Helmet, Black Black 13.0863 NULL 2005-07-01 00:00:00.000 Mountain Bike Socks, M White 3.3963 M 2005-07-01 00:00:00.000 Mountain Bike Socks, L White 3.3963 L 2005-07-01 00:00:00.000 Sport-100 Helmet, Blue Blue 13.0863 NULL 2005-07-01 00:00:00.000 AWC Logo Cap Multi 6.9223 NULL 2005-07-01 00:00:00.000 Long-Sleeve Logo Jersey, S Multi 38.4923 S 2005-07-01 00:00:00.000 Long-Sleeve Logo Jersey, M Multi 38.4923 M 2005-07-01 00:00:00.000 ・ ・ ・ ・
今回使うテーブルはSQL Serverのサンプルデータを一部カスタマイズして利用します。
またレコードは500件ほど入っていますが、一部のみ抜粋しています。
なおこのテーブルでは連番となっているカラムがありません。
これではデータとしてあまりにも使い難いため、ROW_NUMBER関数を使って名前を基準とした昇順に並べ替え、連番のIDを振ってみます。
実際の記述は次のようになります。
select top 10 ROW_NUMBER() OVER(ORDER BY Name ASC) id, * FROM sample_db.dbo.Product GO id Name Color StandardCost Size SellStartDate ------- -------------------------- --------- ---------------- ----- ----------------------- 1 All-Purpose Bike Stand NULL 59.4660 NULL 2007-07-01 00:00:00.000 2 AWC Logo Cap Multi 6.9223 NULL 2005-07-01 00:00:00.000 3 Bike Wash - Dissolver NULL 2.9733 NULL 2007-07-01 00:00:00.000 4 Cable Lock NULL 10.3125 NULL 2006-07-01 00:00:00.000 5 Chain Silver 8.9866 NULL 2007-07-01 00:00:00.000 6 Classic Vest, L Blue 23.7490 L 2007-07-01 00:00:00.000 7 Classic Vest, M Blue 23.7490 M 2007-07-01 00:00:00.000 8 Classic Vest, S Blue 23.7490 S 2007-07-01 00:00:00.000 9 Fender Set - Mountain NULL 8.2205 NULL 2007-07-01 00:00:00.000 10 Front Brakes Silver 47.2860 NULL 2007-07-01 00:00:00.000
RANKとの違い
SQLにはもう一つ「RANK」という連番を振るための関数が存在しますが、RANKとROW_NUMBERには明確な違いがあります。
RANKは同位に対して同順を振り、同位でも異順を振るのがROW_NUMBERとなります。
もう少しわかりやすく説明するなら、RANKを使った場合にはソート時に同じ順位付けをされるものが出てくる可能性があるということです。
このことから、単純に連番を付ける関数として考えた場合にはROW_NUMBERの方が向いているといえます。
まとめ
いかがでしたか?
今回は連番を振る関数である「ROW_NUMBER」について解説してみました。
ROW_NUMBER自体はそんなに覚えることが多いわけではない為、少ない説明でもマスターすることは出来るはずです。
ただ、RANKとの違いを覚えておかないとケースによって使い分けることが難しくなる可能性もありますので、しっかりと知識も増やしていきましょう。