36

ROW_NUMBER()3258170代わりにの開始を定義したいと思います1

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

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

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

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

4

4 に答える 4

80

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

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

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

混乱を避けるために、定数値をNULLに置き換えました。SQL Serverでは、これにより実際に行を並べ替えることなく連番が割り当てられることがわかりました。これはパフォーマンス上の利点ですが、文書化されているものではないため、これに依存することはできません

于 2013-03-04T20:05:31.337 に答える
10

これは簡単だと思います

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)
于 2016-08-19T09:28:37.193 に答える
1

時々....

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関数などを使用した複雑なクエリでシーケンスを使用するのが難しい場合があることです。完全なシーケンスのドキュメントについては、こちらを参照してください。

于 2017-12-27T21:07:16.290 に答える
0

階層構造をアプリケーションにインポートしている状況で、シーケンス番号は各階層レベル内で一意であり、110から開始する必要がありました(その後の手動挿入を容易にするため)。事前のデータはこんな感じでした...

Level Prod        Type  Component      Quantity     Seq
1   P00210005       R   NZ1500         57.90000000  120
1   P00210005       C   P00210005M     1.00000000   120
2   P00210005M      R   M/C Operation   20.00000000 110
2   P00210005M      C   P00210006      1.00000000   110
2   P00210005M      C   P00210007      1.00000000   110

row_number()関数で新しいシーケンス番号を生成したかったのですが、10を加算してから10を掛けることは期待どおりに達成できませんでした。等差関数のシーケンスを強制するには、row_number()全体を囲み、句を括弧で囲む必要があります。row_number()自体に対してのみ、単純な加算と減算を実行できます。

だから、この問題の私の解決策は

、10 * 10 + row_number()over(タイプdescによるレベル順によるパーティション、[Seq] asc) [NewSeq]

加算後に乗算が発生するように、括弧の位置に注意してください。

Level Prod        Type  Component      Quantity     [Seq] [NewSeq]
1   P00210005       R   NZ1500        57.90000000   120   110
1   P00210005       C   P00210005M    1.00000000    120   120
2   P00210005M      R   M/C Operation 20.00000000   110   110
2   P00210005M      C   P00210006     1.00000000    110   120
2   P00210005M      C   P00210007     1.00000000    110   130
于 2020-02-07T12:02:30.153 に答える