这是一个冗长的问题:
作为一种假设情况,我试图在两家公司之间拆分数据表:OPM,MON。
|NAME |ACCOUNT |BALANCE |COMPANY
_______________________________________________
|SMITH |11111 |100 |
|SMITH |11111 |150 |
|HUNTER |11121 |200 |
|HUNTER |11131 |250 |
|LITTLE |11141 |300 |
|RIDLEY |11151 |300 |
|RIDLEY |11151 |100 |
|ARMSTRONG |11161 |150 |
|ARMSTRONG |11171 |150 |
|HENRY |11181 |100 |
客户数据有几种情况。 1.客户有两个帐户,两个帐户都有相同的帐号,但余额不同。 2.客户有两个帐户,不同的帐号和不同的余额。 3.客户有一个帐户,一个帐号,一个余额。
我需要在SQL / PL-SQL中编写逻辑,使数据能够完成对两个不同公司之一的分配,并遵循规则。
客户,无论帐户数量多少,都必须分配给同一家公司。
帐户的价值必须大致相等。
帐户数量必须大致相等。
我接受我提供的数据的限制,但逻辑必须外推到更大的数据集。实现这一目标的最佳方法是什么?
答案 0 :(得分:0)
你要做的是装箱问题,这通常很难。但是,您只需声明两组需要大致相等。因此,我建议为每位客户添加余额并采用分层样本:
select name, balance,
(case when mod(seqnum, 2) = 0 then 'Company1' else 'Company2' end)
from (select name, sum(balance) as balance,
row_number() over (order by balance) as seqnum
from table t
group by name
) n
注意:这是一种近似方法。它将每个组中的一半帐户放在一起,并且它们应该具有相似的总余额。在许多情况下,这不会产生最佳解决方案(例如,当其中一个名称"与其他人相比具有非常大的余额时),但它可能已经足够好了。