怎么从一个表中查询多个(包括一个)字段(数值型),字段之和约等于一个特定数,并找出其最接近的一组数。
例如表:id num
1 5
2 9
3 2
4 8
5 2
6 3假设我输入10,就能得出id num
3 2
4 8或
4 8
5 2
注:是约等于,最接近的数。
例如表:id num
1 5
2 9
3 2
4 8
5 2
6 3假设我输入10,就能得出id num
3 2
4 8或
4 8
5 2
注:是约等于,最接近的数。
2:使用sql表达式完成
具体还是要找个教优算法!
数据量不打得话 试试:
select * from t where id = (select a.id from t a , t b where a.num + b.num = 10 and rownum = 1 and a.id < b.id)
再查找另外一个?
select * from t where num = 10 - (select num from t where id = ***)
(1)建立一个结构体数组,把数据库里的id和num读出来存进去
(2)按照num的值排序
(3)确定阀值,也就是到底十几才算“约等于”10?大于的数可以不管
(4)得到一个数就满足条件的情况(5)10/2=5,取中间数的下标向小和大两个方向搜索数组,判断和“约等于”10,得到2个数满足条件的情况
(6)10/3=3,。。
(7)可以一直进行下去反正,这样做的结果就是:数据量大的情况下,你的机器保证变蜗牛!
用程序或者存储过程实现。
先选择小等于阀值的数据集合。
再再集合中遍历查询。
from table a, table b
where a.id<>b.id select id1, id2, min(abs(num-10)) from #tmp
select id,num,val from (select id,num,10-(id+num) as val from test order by val) where val>=0 and rownum<2
union
select id,num,val from (select id,num,10-(id+num) as val from test order by val desc) where val<=0 and rownum<2
我按你的数据取出来是如下结果:
ID NUM
---------- ----------
2 9 /* 大于等于10的最小值 */
6 3 /* 小于等于10的最大值 */
不知道是不是你要的效果!
大家不要被我举的例子迷惑,理解这个就可以了。从一组数中找出和接近于一个特定数的最佳组合。楼主的意思是,不管怎么计算只要结果最近??
就是说两个字段不管通过像加减乘除等运算,只要结果最接近输入的数就行?
还是只要两个字段相加的结果与输入的数据最接近?
也可以是最佳组合、次佳组合排列出来。从一组数中找出(和)接近于一个特定数的最佳组合,注意是之和,还有不是两个字段,有的话也只是一个字段。再就是最佳组合不一定是两个数,一个数,两个数,三个数或更多都有可能。
输出的结果是
id num
1 5
3 21 5
5 23 2
5 2
6 3是这个意思吗?
差不多就这个意思。