职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1356|回复: 4

[转载]扩展求方差的mysql函数例子

[复制链接]
cayean 发表于 2007-5-28 10:46 | 显示全部楼层 |阅读模式
原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?BoardID=196&ID=97485

源码
// 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-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 &#39;variance.dll&#39;;
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>
愚人 发表于 2007-7-8 11:50 | 显示全部楼层
希望大家帮我把这个帖发给你身边的人,谢谢!
懒散的猫 发表于 2007-7-11 18:25 | 显示全部楼层
好漂亮的说!~~
yoyo 发表于 2007-7-11 18:25 | 显示全部楼层
君子以自强不息 地势坤 君子以厚德载物
kjzh123 发表于 2007-7-13 00:50 | 显示全部楼层
谢 谢
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-14 08:19 , Processed in 0.148771 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表