我有以下数据,其中有治疗编号及其各自的客户。我想使每种处理都拥有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
答案 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