[原创]扩展求方差的mysql函数例子
<P>源码<BR>// Author: JiangMiao<BR>// Name: 扩展求方差的mysql函数列子<BR>// Date: 2006-10-19<BR>// Link: <a href="http://blog.sina.com.cn/u/1259926384" target="_blank" >http://blog.sina.com.cn/u/1259926384</A> - JiangMiao的Blog<BR>#include "winsock2.h"<BR>#include "mysql.h"<BR>#include <vector><BR>using namespace std;<BR>#define SAFE_DELETE(p) if(p!=NULL){delete p;p=NULL;}<BR>#define CDLLEXPORT extern "C" __declspec(dllexport)<BR>typedef __int64 longlong;<BR>typedef vector<double> vec_double;<BR>typedef unsigned long ulong;<BR>class VAR<BR> {<BR> private:<BR> vec_double datas;<BR> double total;<BR> public:<BR> VAR():total(0.0) {}<BR> //加入num<BR> void push_back(double num)<BR> {<BR> datas.push_back(num);<BR> total+=num;<BR> }<BR> void clear()<BR> {<BR> datas.clear();<BR> total=0.0;<BR> }<BR> //取方差<BR> double getVariance()<BR> {<BR> size_t count=datas.size();<BR> double avr=0.0;<BR> avr=(total/count); //平均数<BR> double rt=0.0;<BR> for(size_t i=0;i<count;i++)<BR> {<BR> double k=(datas[i]-avr);<BR> rt+=k*k;<BR> }<BR> return rt/count;<BR> }<BR> <BR> };<BR>CDLLEXPORT my_bool variance_init(UDF_INIT *initid, UDF_ARGS *args, char *message)<BR> {<BR> initid->ptr = NULL;<BR> if(args->arg_count!=1) //参数个数为1<BR> {<BR> return 1;<BR> }<BR> if(args->arg_type[0]!=REAL_RESULT||args->arg_type[0]!=INT_RESULT) //参数类别为整型或double<BR> {<BR> return 1;<BR> }<BR> initid->ptr = (char*)new VAR();<BR> return 0;<BR> }<BR>CDLLEXPORT void variance_deinit(UDF_INIT *initid)<BR> {<BR> VAR* ptr=(VAR*)initid->ptr;<BR> delete ptr;<BR> }<BR>CDLLEXPORT double variance(UDF_INIT *initid, UDF_ARGS *args,char *is_null, char *error)<BR> {<BR> VAR* ptr=(VAR*)initid->ptr;<BR> return ptr->getVariance();<BR> }<BR>CDLLEXPORT void variance_clear(UDF_INIT *initid, char *is_null, char *error)<BR>{<BR> VAR* ptr=(VAR*)initid->ptr;<BR> ptr->clear();<BR>}<BR>CDLLEXPORT void variance_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)<BR>{ <BR> VAR* ptr=(VAR*)initid->ptr;<BR> char* argo=args->args[0];<BR> double arg;<BR> if(args->arg_type[0]==REAL_RESULT)<BR> {<BR> arg=*(double*)argo;<BR> }<BR> if(args->arg_type[0]==INT_RESULT)<BR> {<BR> arg=(double)*(__int64*)argo;<BR> }<BR> ptr->push_back(arg);<BR>}<BR> <BR> <BR>编译后得到variance.dll<BR>复制到bin目录下<BR> <BR>测试<BR>mysql> use test;<BR>Database changed<BR>mysql> create table vartest (realtest real,inttest int);<BR>Query OK, 0 rows affected (0.11 sec)</P><P>mysql> insert into vartest values(5,5),(6,6),(9,9),(10,10),(5,5);<BR>Query OK, 5 rows affected (0.03 sec)<BR>Records: 5 Duplicates: 0 Warnings: 0</P>
<P>mysql> create aggregate function variance returns real soname 'variance.dll';<BR>Query OK, 0 rows affected (0.00 sec)</P>
<P>mysql> select variance(realtest),variance(inttest) from vartest;<BR>+--------------------+-------------------+<BR>| variance(realtest) | variance(inttest) |<BR>+--------------------+-------------------+<BR>| 4.4 | 4.4000 |<BR>+--------------------+-------------------+<BR>1 row in set (0.00 sec)</P>
<P>mysql></P>
<P>如果有建议或疑问欢迎留言<BR>我的blog是<a href="http://blog.sina.com.cn/u/1259926384" target="_blank" >http://blog.sina.com.cn/u/1259926384</A></P> <P>不错~</P>
页:
[1]
