5

我正在尝试执行一个选择语句,该语句被分组为多个“块”,由用户定义的数字定义(例如 5 个,可以说是 12 行)

我想要实现的是一个选择语句,该语句附加一个列,该列定义了已定义块大小的递增组值,因此对于 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 回答