急急急!!!关于INTERBASE的问题...200分!(200分)

  • 主题发起人 主题发起人 sds
  • 开始时间 开始时间
S

sds

Unregistered / Unconfirmed
GUEST, unregistred user!
1.在客户端程序中如何实现测试INTERBASE服务器是否成功连接;
2.在客户端程序中如何实现得到INTERBASE服务器传向客户端数据量的流量值和流量传输的百分率;
3.INTERBASE服务器储存过程如何进行标准偏差(STDEV)统计函数计算,如不可是否可在DELPHI4.0中实现如何实现?
 
1. 连接数据源的时候可以根据错误代码知道是否同服务器建立起正确的连接吧?
2. 需要自己做端口监视的代码。BTW, 什么是“流量传输的百分率"?
 
1设置TDATABASE,当CONNECT时连接不成功会发生ERROR。
2用SQL MONITOR观测
 
对于第三个问题所说的标准方差 在Interbase如何用存储过程实现, 我
并不太清楚(因为对Interbase的参数传递和平方根的函数不太清楚) ,
在Delphi 中肯定可以实现.

标准方差的公式如下 :
n _
s = SQRT( ∑ (( Xi - x )^2) /(n * (n -1)) )
i=1
先用SQL语句
Select Count(Val), avg(val) from dataTable
_
求出 数量 n 和 平均值 x

再用 带参数的SQL语句求标准偏差的平方:
Select Sum((val - :x1)*(val -:x2)) / :dn from dataTable
_
其中参数:x1,:x2都为 x, 参数:dn为 n * (n - 1)

求出的值再用SQRT函数求平方根, 即可得到标准偏差.

具体程序我就不写了.

 
哈哈!又是InterBase!

1.用FIB啦!多年使用,屡试不爽!FIB可支持多种协议:Local,TCP/IP,NetBeui,
为了省事我做了一个DLL,只需调用一下即可,可返回大部分错误.要吗?
2.还是FIB,FIB在执行完一个Query后返回一个数据块结构,你查一个记录数和
每个记录结构的大小,一乘就得啦!别信他们的,SQL Monitor只能监测用户
的查询类别,查流量,没戏!
3.Interbase的存贮过程语法有些简陋,复杂的过程编不了.但Interbase最大
的好处是可以支持UDF!你编一个DLL(当然格式必须按规定的来),交给
InterBase,然后你可以在存贮过程中用它,也可以在DSQL中用它!
Seasky的方法肯定不灵,因为Interbase不支持Sqrt求平方根,除非从存贮
过程拿到中间结果然后后面部分拿到Delphi中处理.不过,我最反对这种
数据库里做一半,应用程序中做一半的搞法.
我可以将Seasky的方法写成过程你试试:

CREATE PROCEDURE S RETURNS (MYSQRTTOTAL FLOAT,MYCOUNT INTEGER) AS
DECLARE VARIABLE MYAVG FLOAT;
BEGIN
SELECT AVG(MYFIELD),COUNT(*) FROM MYTABLE INTO MYAVG,MYCOUNT;
SELECT SUM((MYFIELD-MYAVG)*(MYFIELD-MYAVG)) FROM MYTABLE INTO MYSQRTTOTAL;
END;

然后在Delphi中执行一个Query:
EXECUTE PROCEDURE S RETURNING_VALUES F1,F2

返回两个结果:方差和记录数,Result :=
Sqrt(Fields[0].AsFloat / Fields[1].AsInteger);

与其如些还不如用一个没有存贮过程的方法简单:

procedure GetAvgSqrt;
var
MyCount: Integer;
MySqrtTotal, MyTotal: Extended;
begin
MyQuery.SQL.Text := 'SELECT MYFIELD FROM MYTABLE';
ExecuteQuery;
MySqrtTotal := 0;
MyTotal := 0;
MyCount := 0;
while not MyQuery.EOF do begin
MyTotal := MyTotal + Fields[0].AsFloat;
MySqrtTotal := MySqrtTotal + Fields[0].AsFloat * Fields[0].AsFloat;
Inc(MyCount);
Next;
end;
Result := Sqrt(MySqrtTotal - MyTotal * MyTotal / MyCount) /
MyCount / (MyCount - 1);
end;
 
更正:Fields和Next前少了一个MyQuery.
 
Barton, 用你的Pascal算的方差不对.
你用三个同样的值测算一下标准偏差, 数值应该为 0, 但是
你的算法中分母为 (数值的平方) 的和 减去 (数值总和)的平方, 肯定不为0.
所以肯定不行.

奇怪 我明明想的是用Delphi的思路, 我明明知道InterBase中没有平方根函数,
怎么写成了这样, 看来脑子用的糊涂了, 我的思路就是Delphi中的思路;

好象求方标准偏差必须对数据用两次循环, 一次求均值、数量, 一次求
相对于均值的偏差.
 
我不会输入“汇总”符号,但公式是:

n-1除(平方的和与n除和的平方的差)的根!
 
公式这么改:
Result := Sqrt((MySqrtTotal - MyTotal * MyTotal / MyCount) / (MyCount - 1));
 
To SeaSky:
n _
s = SQRT( ∑ (( Xi - x )^2) /(n * (n -1)) )
i=1

n _ _
= SQRT( ∑ ( (Xi^2 + x^2 - 2Xi*x) ) /(n * (n -1)) )
i=1

n _ _ n
= SQRT( ( ∑ (Xi^2) + n*(x^2) - 2*x*∑Xi ) /(n * (n -1)) )
i=1 i=1

n _
= SQRT( ( ∑ (Xi^2) - n*(x^2) ) /(n * (n -1)) )
i=1

确实只要一次循环


 
我也不会,但是我是拷贝了SeaSky的共识然后修改的,:)
 
To barton :

假设有三个值: 30,30,30 .

我想知道你的公式算出来是多少? 如果不是0 ,就肯定不对。

汇总符号可以用 中文区位字符代替。
 
Pega : 怎么还在, 我刚刚才看到8个帖子, 这么一下有三个。
_
不会吧, 你怎样求平均值x? 好象要先有一次循环求它吧?
 
理解错了, 可以的, 但是好象要再加一步推算就明显了

n _ _
= SQRT( ( ∑ (Xi^2) - n * x * n * x / n) /(n * (n -1)) )
i=1
n n
= SQRT( ( ∑ (Xi^2) - (∑ Xi )^2 / n) /(n * (n -1)) )
i=1 i=1

这样的话, 可以用一句Sql来完成求出方差, 然后用Delphi的SQrt求出标准
偏差

Select (SUM(val*val)- SUM(Val)*sum(val)/count(val)) /
(count(val)* (count(val)-1))
from table1

 
To barton:
Result := Sqrt((MySqrtTotal - MyTotal * MyTotal / MyCount) /(MyCount - 1)/MyCount);
 
New :

Select (SUM(val*val)- SUM(Val)*AVG(val)) /
(count(val)* (count(val)-1))
from table1

 
多人接受答案了。
 
后退
顶部