编程论坛's Archiver

antter 发表于 2006-10-20 00:42

[原创]扩展求方差的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 &lt;vector&gt;<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&lt;double&gt; 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&lt;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-&gt;ptr = NULL;<BR> if(args-&gt;arg_count!=1) //参数个数为1<BR>  {<BR>  return 1;<BR>  }<BR> if(args-&gt;arg_type[0]!=REAL_RESULT||args-&gt;arg_type[0]!=INT_RESULT) //参数类别为整型或double<BR>  {<BR>  return 1;<BR>  }<BR> initid-&gt;ptr = (char*)new VAR();<BR> return 0;<BR> }<BR>CDLLEXPORT void variance_deinit(UDF_INIT *initid)<BR> {<BR> VAR* ptr=(VAR*)initid-&gt;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-&gt;ptr;<BR> return ptr-&gt;getVariance();<BR> }<BR>CDLLEXPORT void variance_clear(UDF_INIT *initid, char *is_null, char *error)<BR>{<BR> VAR* ptr=(VAR*)initid-&gt;ptr;<BR> ptr-&gt;clear();<BR>}<BR>CDLLEXPORT void variance_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)<BR>{ <BR> VAR* ptr=(VAR*)initid-&gt;ptr;<BR> char* argo=args-&gt;args[0];<BR> double arg;<BR> if(args-&gt;arg_type[0]==REAL_RESULT)<BR>  {<BR>  arg=*(double*)argo;<BR>  }<BR> if(args-&gt;arg_type[0]==INT_RESULT)<BR>  {<BR>  arg=(double)*(__int64*)argo;<BR>  }<BR> ptr-&gt;push_back(arg);<BR>}<BR> <BR> <BR>编译后得到variance.dll<BR>复制到bin目录下<BR> <BR>测试<BR>mysql&gt; use test;<BR>Database changed<BR>mysql&gt; create table vartest (realtest real,inttest int);<BR>Query OK, 0 rows affected (0.11 sec)</P>
<P>mysql&gt; 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&gt; create aggregate function variance returns real soname 'variance.dll';<BR>Query OK, 0 rows affected (0.00 sec)</P>
<P>mysql&gt; 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&gt;</P>
<P>如果有建议或疑问欢迎留言<BR>我的blog是<a href="http://blog.sina.com.cn/u/1259926384" target="_blank" >http://blog.sina.com.cn/u/1259926384</A></P>

ss123456789 发表于 2006-11-9 15:03

<P>不错~</P>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.