SQL Select语句拆分为分组/块

时间:2013-10-18 11:09:52

标签: sql postgresql

我正在尝试执行一个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     |

2 个答案:

答案 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

SQLFiddle demo

答案 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