Oracle SQL - 获取满足百分比分配的行

问题描述 投票:0回答:1

我正在根据某些标准选择项目参与者,在满足标准后,从特定部门 A 获得 x%(比如 60%),其余 20% 从另一个部门 B 获得,最后 20% 从部门获得C. 我能够在名为 flag_criteria 的列中标记符合条件的行,并且我在部门列中确实有部门名称,但是我不知道如何根据部门列中的百分比分配获取行。举个例子:

enter image description here

现在,根据分配百分比,我创建了一个新列“分配”,在符合条件的 10 行中,我从 A 部门分配了 60%,从 B 部门分配了 20%,从 C 部门分配了 20%。

enter image description here

我该如何在 SQL 中处理这个问题?另外,如果没有行满足分配百分比,我想将“额外”分配给下一个部门。请指教。

sql oracle-database percentage partition
1个回答
0
投票

通过 (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
;
© www.soinside.com 2019 - 2024. All rights reserved.