时间:2016-02-24 21:20 来源:
我爱IT技术网 作者:佚名
欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【扩展求方差的mysql函数例子】,下面是详细的分享!
扩展求方差的mysql函数例子
源码
以下为引用的内容:
// Author: JiangMiao // Name: 扩展求方差的MySQL函数列子 // Date: 2006-10-19 // Link: http://blog.sina.com.cn/u/1259926384 - JiangMiao的Blog #include "winsock2.h" #include "MySQL.h" #include <vector> using namespace std; #define SAFE_DELETE(p) if(p!=NULL){delete p;p=NULL;} #define CDLLEXPORT extern "C" __declspec(dllexport) typedef __int64 longlong; typedef vector<double> vec_double; typedef unsigned long ulong; class VAR { private: vec_double datas; double total; public: VAR():total(0.0) {} //加入num void push_back(double num) { datas.push_back(num); total+=num; } void clear() { datas.clear(); total=0.0; } //取方差 double getVariance() { size_t count=datas.size(); double avr=0.0; avr=(total/count); //平均数 double rt=0.0; for(size_t i=0;i<count;i++) { double k=(datas[i]-avr); rt+=k*k; } return rt/count; }
}; CDLLEXPORT my_bool variance_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { initid->ptr=NULL; if(args->arg_count!=1) //参数个数为1 { return 1; } if(args->arg_type[0]!=REAL_RESULT||args->arg_type[0]!=INT_RESULT) //参数类别为整型或double { return 1; } initid->ptr=(char*)new VAR(); return 0; } CDLLEXPORT void variance_deinit(UDF_INIT *initid) { VAR* ptr=(VAR*)initid->ptr; delete ptr; } CDLLEXPORT double variance(UDF_INIT *initid, UDF_ARGS *args,char *is_null, char *error) { VAR* ptr=(VAR*)initid->ptr; return ptr->getVariance(); } CDLLEXPORT void variance_clear(UDF_INIT *initid, char *is_null, char *error) { VAR* ptr=(VAR*)initid->ptr; ptr->clear(); } CDLLEXPORT void variance_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { VAR* ptr=(VAR*)initid->ptr; char* argo=args->args[0]; double arg; if(args->arg_type[0]==REAL_RESULT) { arg=*(double*)argo; } if(args->arg_type[0]==INT_RESULT) { arg=(double)*(__int64*)argo; } ptr->push_back(arg); }
|
编译后得到variance.dll
复制到bin目录下
测试
以下为引用的内容:
MySQL> use test; Database changed MySQL> create table vartest (realtest real,inttest int); Query OK, 0 rows affected (0.11 sec)
MySQL> insert into vartest values(5,5),(6,6),(9,9),(10,10),(5,5); Query OK, 5 rows affected (0.03 sec) Records: 5 Duplicates: 0 Warnings: 0
MySQL> create aggregate function variance returns real soname 'variance.dll'; Query OK, 0 rows affected (0.00 sec)
MySQL> select variance(realtest),variance(inttest) from vartest; +--------------------+-------------------+ | variance(realtest) | variance(inttest) | +--------------------+-------------------+ | 4.4 | 4.4000 | +--------------------+-------------------+ 1 row in set (0.00 sec)
MySQL>
|
以上所分享的是关于扩展求方差的mysql函数例子,下面是编辑为你推荐的有价值的用户互动:
相关问题:Excel中的求方差到底用哪个函数?
答:VAR()的函数计算为[n∑x^2-(∑x)^2]/[n(n-1)]显然不是你要的 VARA()同上计算,但包含 TRUE 的参数作为 1 计算;包含文本或 FALSE 的参数作为 0 计算 VARP()的函数计算为[n∑x^2-(∑x)^2]/n^2, VARPA()同VARA(),但包含 TRUE 的参数作为 1 计算;... >>详细
相关问题:mysql中用sum函数求出的结果是什么类型的
答:sum函数在数据库是number类型的,你的代码中可以使用任何装的下数字型都可以接收。如:sum的值小于java中int的最大值,你就可以用int接收;如果大于Int的最大值而小于double的最大值,你就可以用double。一般在程序设计时,如果不确定它的值范围... >>详细
相关问题:求改一个 sqlserver函数语句 放到mysql数据库里面执行
答:CREATE FUNCTION myFunction (UserID int) RETURNS VARCHAR(255) BEGIN DECLARE strReturn varchar(255); Set strReturn = ''; Select UserName into strReturn from dddUser where nID=UserID ; RETURN(strReturn); >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-