当前位置: 首页 > 图文教程 > 数据库 > MYSQL > 扩展求方差的mysql函数例子

MYSQL
MYSQL常用命令与实用技巧
用mysqldump备份和恢复指定表的方法
MYSQL常见出错代码对照
dmysql自己封装的mysql库
虚拟主机MySQL数据库的备份与还原的方法
推荐没有虚拟主机的小巧的Mysql数据库备份脚本(PHP)
MySQL数据库备份方法说明
asp采用ODBC接口访问MySQL的方法
找到一种不错的从SQLServer转成Mysql数据库的方法
MySQL UDF调试方式debugview的相关方法
使用dreamhost空间实现MYSQL数据库备份方法
MYSQL导入导出命令详解
MYSQL命令行模式管理MySql的一点心得
解决MySQL数据库中文模糊检索问题的方法
Mysql以utf8存储gbk输出的实现方法提供
mysql连接过多和死掉以及拒绝服务的解决方法
在MySQL数据库中复位根用户的密码的方法
mysql数据库查询优化 mysql效率
MySQL数据库的出错代码列表
MySQL 1067错误解决方法集合

MYSQL 中的 扩展求方差的mysql函数例子


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 61 ::
收藏到网摘: n/a

源码

以下为引用的内容:

// 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>