我有一个表,它有两列表名和表大小。我想把这张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)
1条答案
按热度按时间olqngx591#
这实际上是一个非常难的问题——我认为它是np完全的,这是一类非常难的问题,基本上需要你搜索所有可能的组合。
有一些近似的解决方案应该很有效。例如,如果你把行分成4个一组,一组取1/4,另一组取2/3,这应该很好。
就你而言:
对于这个特殊的数据,这两组分别是110+60+40和80+70+20+10——虽然不太完美,但非常接近。