Oracle SQL:根据3个条件对数据进行分组和分配

时间:2015-05-12 13:12:24

标签: sql plsql logic oracle-sqldeveloper

这是一个冗长的问题:

作为一种假设情况,我试图在两家公司之间拆分数据表: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中编写逻辑,使数据能够完成对两个不同公司之一的分配,并遵循规则。

  1. 客户,无论帐户数量多少,都必须分配给同一家公司。

  2. 帐户的价值必须大致相等。

  3. 帐户数量必须大致相等。

  4. 我接受我提供的数据的限制,但逻辑必须外推到更大的数据集。实现这一目标的最佳方法是什么?

1 个答案:

答案 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

注意:这是一种近似方法。它将每个组中的一半帐户放在一起,并且它们应该具有相似的总余额。在许多情况下,这不会产生最佳解决方案(例如,当其中一个名称"与其他人相比具有非常大的余额时),但它可能已经足够好了。