我正在尝试执行一个select语句,该语句被分组为多个“块”,由用户定义的数字定义(例如,5,从12行开始)
我想要实现的是一个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 |
答案 0 :(得分:6)
您应该将RowNum分为5,例如/
select ROW_NUMBER() over (ORDER BY id) RowNum,
id,
((ROW_NUMBER() over (ORDER BY id) - 1) / 5) +1 as ChunkNo
from t
答案 1 :(得分: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