如何将一个sql表分成两个表,使两个表的大小之和几乎相等

blmhpbnm  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(474)

我有一个表,它有两列表名和表大小。我想把这张table分成两半,这样table大小之和的差就是最小的 Table(table_name char(25), table_size int) ```
Select * from Table gives
T1 110
T2 80
T3 70
T4 60
T5 40
T6 20
T7 10

所以我想把它分成两个表table1和table2,这样

Table1 should contain now (T1, T7, T2)
Total sum = 110+ 10+ 80 = 200

Table2 should contain now (T3,T4,T5, T6)
Total sum = 70+60+40 + 20 = 190

如何使用sql查询实现这一点?如果有一个通用的解决方案,我。e。将这个表划分为m个分区,并创建相应的m个表,或者可以将每个分区的表存储在一个列表中。
运行查询时得到的输出。

select t.,
(case when seqnum % 4 in (1, 4) then 1 else 2 end) as grouping
from (select t.
,
row_number() over (order by table_size desc) as seqnum
from t
) t

table_name table_size seqnum grouping


T1 100 1 1
T2 80 2 2
T3 70 3 2
T4 60 4 2
T5 40 5 1
T6 20 6 2
T7 10 7 2
(7 rows)

olqngx59

olqngx591#

这实际上是一个非常难的问题——我认为它是np完全的,这是一类非常难的问题,基本上需要你搜索所有可能的组合。
有一些近似的解决方案应该很有效。例如,如果你把行分成4个一组,一组取1/4,另一组取2/3,这应该很好。
就你而言:

select t.*,
       (case when seqnum % 4 in (1, 4) then 1 else 2 end) as grouping
from (select t.*,
             row_number() over (order by table_size desc) as seqnum
      from t
     ) t

对于这个特殊的数据,这两组分别是110+60+40和80+70+20+10——虽然不太完美,但非常接近。

相关问题