5

ユーザー定義の数(たとえば、5、12行としましょう)で定義された、複数の「チャンク」にグループ化されたselectステートメントを実行しようとしています

私が達成したいのは、定義されたチャンク サイズの増分グループ値を定義する列を追加する select ステートメントです。したがって、12 行の場合、行 1 ~ 5 はチャンク 1 に等しく、行 6 ~ 10 はチャンク 2 に等しくなります。行 11 ~ 12 はチャンク 3 に相当します。

私はこの解決策をいくつかの機会に検索してみましたが、ほとんど成功しませんでした。基本的な ROW_NUMBER() OVER (ORDER BY id) を変更して、5 行ごとにカウントをリセットし、グループを増やす方法があると思いました。 /かたまり。

この結果を達成する方法は他にもあると思いますが、最も簡単で最もクリーンな最速のソリューションを探しています。これを、バッチ送信のための最良のシナリオのグループ化を行う必要がある関数に適用することを考えます。

希望する出力の例。


| Row no. | Item Id. | Chunk No. |
|--------:|:--------:|:---------:|
|    1    |   1001   |     1     |
|    2    |   1002   |     1     |
|    3    |   1003   |     1     |
|    4    |   1004   |     1     |
|    5    |   1005   |     1     |
|    6    |   1006   |     2     |
|    7    |   1007   |     2     |
|    8    |   1008   |     2     |
|    9    |   1009   |     2     |
|    10   |   1010   |     2     |
|    11   |   1011   |     3     |  
|    11   |   1012   |     3     |

4

2 に答える 2

7

たとえば、RowNumを5に分割する必要があります/

select ROW_NUMBER() over (ORDER BY id) RowNum,
       id,
       ((ROW_NUMBER() over (ORDER BY id) - 1)  / 5) +1 as ChunkNo  
from t

SQLFiddle デモ

于 2013-10-18T11:32:44.640 に答える
1

カスタム ラベルを使用した別のソリューションと同じように:

SELECT 
ROW_NUMBER() over (ORDER BY ID) AS RowNum,
id,
  CASE
    WHEN ntile(3) over(ORDER BY ID)=1 THEN 'Label 1'
    WHEN ntile(3) over(ORDER BY ID)=2 THEN 'Label 2'
    WHEN ntile(3) over(ORDER BY ID)=3 THEN 'Label 3'
    ELSE 'OTHER'
  END AS My_Chunks
FROM t

または単純な

SELECT 
 ROW_NUMBER() over (ORDER BY ID) AS RowNum,
 id,
 ntile(3) over(ORDER BY ID) AS My_Chunks
FROM t
于 2014-07-07T15:53:18.163 に答える