如何在Oracle Select SQL中的类似类型的N行之后创建批号?

时间:2018-08-02 16:13:03

标签: sql oracle

我有以下数据,其中有治疗编号及其各自的客户。我想使每种处理都拥有3个客户,并希望关联一个批次ID。例如,对于T0001 3,客户将具有唯一的批次ID。其余2个将具有另一个批次ID。同样,对于T0002,将有另一个批次ID,该ID仅具有这2个客户。意味着每个批次每个处理号最多可容纳3个客户。

当前表

Treatment Number    Customer ID     
T00001              C01             
T00001              C02                 
T00001              C03             
T00001              C04                 
T00001              C05             
T00002              C06             
T00002              C07             
T00004              C09             

必需的结果

Treatment Number    Customer ID     Batch ID
T00001              C01             1
T00001              C02             1   
T00001              C03             1
T00001              C04             2   
T00001              C05             2
T00002              C06             3
T00002              C07             3
T00004              C09             4

2 个答案:

答案 0 :(得分:1)

我只是对row_number()进行算术运算以在每次处理中分配批次ID:

select t.*,
       floor( (row_number() over (partition by treatment order by customer) - 1) / 3) as batch_id
from t;

然后,我将使用dense_rank()对其进行全局分配:

select t.*, dense_rank() over (order by treatment, batch_id_within) as batch_id
from (select t.*,
             floor( (row_number() over (partition by treatment order by customer) - 1) / 3) as batch_id_within
      from t
     ) t

答案 1 :(得分:0)

首先使用ROW_NUMBER按要求的顺序(我使用的是customer_id列)为每种处理方法分配序号(从0开始)。

对于每个等于0的行号或所有带有BATCH_START的行,将mod(rn,3) = 0定义为 1

然后简单地通过总结 BATCH_ID来计算BATCH_START

示例

with cust2 as (
select 
TREATMENT_NUBMBER, CUSTOMER_ID,
row_number() over (partition by TREATMENT_NUBMBER order by CUSTOMER_ID)-1 rn
from cust),
cust3 as(
select TREATMENT_NUBMBER, CUSTOMER_ID,RN,
case when mod(rn,3) = 0 then 1 end BATCH_START
from cust2)
select TREATMENT_NUBMBER, CUSTOMER_ID, BATCH_START,
sum(BATCH_START) over (order by TREATMENT_NUBMBER, CUSTOMER_ID) BATCH_ID
from cust3
order by TREATMENT_NUBMBER, CUSTOMER_ID;

TREATM CUS BATCH_START   BATCH_ID
------ --- ----------- ----------
T00001 C01           1          1
T00001 C02                      1
T00001 C03                      1
T00001 C04           1          2
T00001 C04                      2
T00002 C04           1          3
T00002 C05                      3