我正在根据某些标准选择项目参与者,在满足标准后,从特定部门 A 获得 x%(比如 60%),其余 20% 从另一个部门 B 获得,最后 20% 从部门获得C. 我能够在名为 flag_criteria 的列中标记符合条件的行,并且我在部门列中确实有部门名称,但是我不知道如何根据部门列中的百分比分配获取行。举个例子:
现在,根据分配百分比,我创建了一个新列“分配”,在符合条件的 10 行中,我从 A 部门分配了 60%,从 B 部门分配了 20%,从 C 部门分配了 20%。
我该如何在 SQL 中处理这个问题?另外,如果没有行满足分配百分比,我想将“额外”分配给下一个部门。请指教。
通过 (dept, flag) 计算分区中的位置并与部门的 % 进行比较:
with data(empid, dept, flag) as (
select 12345, 'A', 1 union all
select 23456, 'A', 1 union all
select 34567, 'B', 1 union all
select 45678, 'A', 0 union all
select 56789, 'A', 1 union all
select 67900, 'A', 1 union all
select 79011, 'B', 1 union all
select 90122, 'C', 0 union all
select 101233, 'A', 1 union all
select 112344, 'A', 1 union all
select 123455, 'C', 1 union all
select 134566, 'B', 1 union all
select 145677, 'C', 0 -- union all
),
percentages(dept, pc) as (
select 'A', 60 union all
select 'B', 20 union all
select 'C', 20 -- union all
)
select d.empid, dept, d.flag,
case when flag = 1 and rn <= n*pc/100
then 'y'
else 'n'
end
as allocation
from (
select empid, dept, flag,
row_number() over(partition by dept, flag order by empid) as rn,
count(empid) over(partition by flag) as n
from data
) d
join percentages p using(dept)
order by d.empid
;