分号将行分成相等的批次

时间:2021-06-30 11:07:57

标签: sql oracle

我有一个表,想将行拆分成批次(添加额外的列,如 batch_no )。

例如,我有一个单列 cust_no 和 total=20 行的表,并将它们分成 5 个批次,如 1、2、3、4 和 5。

预期输出如...

cust_no batch_no
23123   1
2313    1
23      1
323123  1
123     1
23      2
213     2
123     2
2123    2
2123    2
23123   3
2313    3
23      3
323123  3
123     3
23      4
...
...
...
...

1 个答案:

答案 0 :(得分:3)

如果您知道批次数,则使用 ntile()

select t.*,
       ntile(5) over (order by null) as batch
from t;

注意:order by null 表示您不关心排序。它是任意的,不可复制。您可能希望包含一些条件——例如 id 列或创建日期或其他内容,以便批次更加一致。

如果您想要特定大小的批次,请使用 row_number() 和算术:

select t.*,
       (row_number() over (order by null) % 4) as batch
from t;

在某些数据库中,这将是:

select t.*,
       mod(row_number() over (order by null), 4) as batch
from t;