問題:
結果テーブルの各行に個別の番号を付けたいと思います。
例:
私たちのデータベースには、furniture 次の列にデータがあります:code (主キー)とname 。
| code | 名前 |
|---|---|
| 101 | ベッド |
| 202 | ソファ |
| 333 | 椅子 |
| 123 | 本棚 |
| 235 | テーブル |
| 766 | デスク |
furniture テーブルには、番号を付けたい家具の名前が格納されています。
解決策:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
クエリは、各家具の行番号とその名前およびコードを返します。
| num_row | 名前 | コード |
|---|---|---|
| 1 | ベッド | 101 |
| 2 | ソファ | 202 |
| 3 | 椅子 | 333 |
| 4 | 本棚 | 123 |
| 5 | テーブル | 235 |
| 6 | デスク | 766 |
家具の名前は並べ替えられていないことに注意してください。
ディスカッション:
結果セットの各行に番号を付ける場合、SQLはROW_NUMBER()を提供します 働き。この関数はSELECTで使用されます 他の列を持つ句。 ROW_NUMBER()の後 句、OVER()を呼び出します 働き。 OVERに引数を渡した場合 、行の番号付けはどの列に従ってもソートされません。したがって、表示される行の順序は非決定的です。ほとんどの場合、これはレコードがテーブルに挿入された順序です。行の番号付けは1から始まります。この例では、各レコードの番号は1から6です。
列を使用して行番号を割り当てることもできます。以下の例では、名前でソートされたレコードに番号を付けています。これを行うには、その引数をOVERに渡します。 ORDER BYと一緒に (名前の列に従ってレコードを並べ替えます):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
結果セットを見ると、並べ替えられた行とその番号が表示されます。
| row | 名前 | コード |
|---|---|---|
| 1 | ベッド | 101 |
| 2 | 本棚 | 123 |
| 3 | 椅子 | 333 |
| 4 | デスク | 766 |
| 5 | ソファ | 202 |
| 6 | テーブル | 235 |
ROW_NUMBER()によって提供される番号付け 結果テーブルの行の順序とは無関係です。以下の例では、並べ替えられた列名(OVER(ORDER BY name) )、ただし、別の列(この例では、ORDER BY code 。
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
クエリは各行の番号を返しましたが、レコードは列コードに従って並べ替えられているため、これらの番号は昇順ではありません。
| row | 名前 | コード |
|---|---|---|
| 1 | ベッド | 101 |
| 2 | 本棚 | 123 |
| 5 | ソファ | 202 |
| 6 | テーブル | 235 |
| 3 | 椅子 | 333 |
| 4 | デスク | 766 |
ソートされた行のデフォルトの順序は昇順ですが、DESCを使用して降順でソートすることもできます。 並べ替える列の名前の後のキーワード:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
上記のクエリは結果セットを返しました:
| row | 名前 | コード |
|---|---|---|
| 4 | デスク | 766 |
| 3 | 椅子 | 333 |
| 6 | テーブル | 235 |
| 5 | ソファ | 202 |
| 2 | 本棚 | 123 |
| 1 | ベッド | 101 |