报名的有可能3到十几家不等,他们的报价要和标底比,每百分之一为一档次,同在百分之一内的几家取个平均值,然后在计算机不同百分区域的平均值.举例说:系统取出data.ADOQuery_jl.RecordCount个单位报名.分别报价为1000,1002,1005,1300,1301,970,971而标底是999那么前面三个报价(1000,1002,1005)和标底比在一个百分之一的区域,把他们三个取出来做个平均值,中间两个(1300,1301)同标底也在同一百分之一内的区域取出来做个平均直,后两个(970,971)再做个平均值.然后再把得出的三个平均值再平均.
高分请教哦.把投标报价按data.ADOQuery_kbjl.fieldbyname('tbbj').asfloat的形式写出来.代码写的越清楚分越高哦.
高分请教哦.把投标报价按data.ADOQuery_kbjl.fieldbyname('tbbj').asfloat的形式写出来.代码写的越清楚分越高哦.
select value from dbo.TBJG
/*
970.0
971.0
1000.0
1002.0
1005.0
1300.0
1301.0
*/select avg(value) from dbo.TBJG group by substring(cast((value/999) as varchar),1,4)/*
970.5
1002.3333333333334
1300.5
*/
一个上千万条记录的列表,如果你查找的数值正好在中间,那你是中了彩票了,二分法效率齐高无比,如果你找的数值是列表中的第一个,那么二分法和顺序查找法相比还有效率可言吗你的这个问题完全可以通过sql和存储过程解决,没必要放到delphi里,来找一个所谓的高效率算法,看你是DB2板块的,想必对sql和存储过程应该很熟悉了
select value from dbo.TBJG
/*
970.0
971.0
1000.0
1002.0
1005.0
1300.0
1301.0
*/select avg(value) from dbo.TBJG group by substring(cast((value/999) as varchar),1,4)/*
970.5
1002.3333333333334
1300.5
*/select avg(t.value) from
(select avg(value) as value,1 as thelevel
from dbo.TBJG
group by substring(cast((value/999) as varchar),1,4)) t group by thelevel-- 1091.1111111111111
,楼主,这样的sql你总该会写吧
var
i, j, nSum, nCount: Integer;
fSum: Double;
GroupList: array [0..99] of TStringList; //报价分区间
AvgList: array [0..99] of Double; //每个区间的报价平均值
begin
//分组
for i := Low(GroupList) to High(GroupList) do
GroupList[i] := TStringList.Create;
for i := 0 to data.ADOQuery_jl.RecordCount - 1 do
begin
j := Trunc(Abs((StrToInt(NumList[i]) / RightNum) * 100 - 100)) - 1;
GroupList[j].Add(data.ADOQuery_jl.FieldByName('tbbj').AsString);
end;
//计算
for i := Low(GroupList) to High(GroupList) do
begin
AvgList[i] := 0;
if GroupList[i].Count > 0 then
begin
nSum := 0;
for j := 0 to GroupList[i].Count - 1 do
nSum := nSum + StrToInt(GroupList[i][j]);
AvgList[i] := nSum / GroupList[i].Count;
end;
end; fSum := 0;
nCount := 0;
for i := Low(AvgList) to High(AvgList) do
if AvgList[i] > 0 then
begin
nCount := nCount + 1;
fSum := fSum + AvgList[i];
end;
ShowMessage(FloatToStr(fSum / nCount)); mmo2.Lines.Clear;
for i := Low(GroupList) to High(GroupList) do
if GroupList[i].Count > 0 then
mmo2.Lines.Add(GroupList[i].CommaText)
else
mmo2.Lines.Add('...');
end;
|_970
|_971
如 970 /999 得出后到父节点,没有即新建父节点,再把970插入子节点.最后...