web-dev-qa-db-ja.com

Row_Number()の開始値を手動で指定する

ROW_NUMBER()の開始を3258170ではなく1として定義したい。

私は次のSQLクエリを使用しています

SELECT ROW_NUMBER() over(order by (select 3258170))  as 'idd'.

ただし、上記のクエリは機能しません。動作しないと言うときは、その実行は意味しますが、3258170からは開始しません。誰か助けてくれますか?

行番号を指定する理由は、あるテーブルから別のテーブルに行を挿入しているためです。最初のテーブルでは、最後のレコードの行番号は3258169であり、新しいレコードを挿入するときには、3258170の行番号を取得する必要があります。

29
Huzaifa

row_number()の結果に値を追加するだけです:

_select 3258170 - 1 + row_number() over (order by (select NULL)) as idd
_

row_number()の_order by_句は、並べ替えに使用される列を指定しています。そこで定数を指定することで、単に「すべてが順序付けの目的で同じ値を持っている」と言っています。最初に選択した値とは何の関係もありません。

混乱を避けるために、定数値をNULLに置き換えました。 SQL Serverでは、observedがあります。これは実際に行をソートせずに連続番号を割り当てます-観察されたパフォーマンス上の利点ですが、文書化されたものではないため、それに依存することはできません。

56
Gordon Linoff

これは簡単だと思う

ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (To start from 0)
ROW_NUMBER() OVER(ORDER BY Field) + 3258169 AS FieldAlias (To start from 3258170)
8
Tom McDonough

時々....

ROW_NUMBER()は、特に基になるデータセットにレコードが重複している可能性がある場合(JOINクエリなど)に最適なソリューションではない場合があります。これにより、予想よりも多くの行が返される場合があります。 SEQUENCEの作成を検討できます。これは、場合によってはよりクリーンなソリューションと見なすことができます。すなわち:

CREATE SEQUENCE myRowNumberId  
    START WITH 1  
    INCREMENT BY 1 
GO  

SELECT NEXT VALUE FOR myRowNumberId  AS 'idd' -- your query
GO

DROP SEQUENCE myRowNumberId; -- just to clean-up after ourselves
GO

欠点は、DISTINCT、WINDOW関数などを使用した複雑なクエリでシーケンスを使用するのが難しい場合があることです。完全なシーケンスのドキュメントを参照してください here .

1
Milan