1
0
mirror of https://github.com/MariaDB/server.git synced 2026-01-06 05:22:24 +03:00

add VARIANCE function

This commit is contained in:
vva@eagle.mysql.r18.ru
2002-12-14 03:36:59 +04:00
parent 710881e4fb
commit b624df724b
14 changed files with 129 additions and 62 deletions

View File

@@ -255,12 +255,24 @@ double Item_sum_avg::val()
** Standard deviation
*/
void Item_sum_std::reset()
double Item_sum_std::val()
{
sum=sum_sqr=0.0; count=0; (void) Item_sum_std::add();
double tmp= Item_sum_variance::val();
return tmp <= 0.0 ? 0.0 : sqrt(tmp);
}
bool Item_sum_std::add()
/*
** variance
*/
void Item_sum_variance::reset()
{
sum=sum_sqr=0.0;
count=0;
(void) Item_sum_variance::add();
}
bool Item_sum_variance::add()
{
double nr=args[0]->val();
if (!args[0]->null_value)
@@ -272,7 +284,7 @@ bool Item_sum_std::add()
return 0;
}
double Item_sum_std::val()
double Item_sum_variance::val()
{
if (!count)
{
@@ -283,11 +295,10 @@ double Item_sum_std::val()
/* Avoid problems when the precision isn't good enough */
double tmp=ulonglong2double(count);
double tmp2=(sum_sqr - sum*sum/tmp)/tmp;
return tmp2 <= 0.0 ? 0.0 : sqrt(tmp2);
return tmp2 <= 0.0 ? 0.0 : tmp2;
}
void Item_sum_std::reset_field()
void Item_sum_variance::reset_field()
{
double nr=args[0]->val();
char *res=result_field->ptr;
@@ -304,7 +315,7 @@ void Item_sum_std::reset_field()
}
}
void Item_sum_std::update_field(int offset)
void Item_sum_variance::update_field(int offset)
{
double nr,old_nr,old_sqr;
longlong field_count;
@@ -838,6 +849,17 @@ String *Item_avg_field::val_str(String *str)
}
Item_std_field::Item_std_field(Item_sum_std *item)
: Item_variance_field(item)
{
}
double Item_std_field::val()
{
double tmp= Item_variance_field::val();
return tmp <= 0.0 ? 0.0 : sqrt(tmp);
}
Item_variance_field::Item_variance_field(Item_sum_variance *item)
{
name=item->name;
decimals=item->decimals;
@@ -846,7 +868,7 @@ Item_std_field::Item_std_field(Item_sum_std *item)
maybe_null=1;
}
double Item_std_field::val()
double Item_variance_field::val()
{
double sum,sum_sqr;
longlong count;
@@ -862,10 +884,10 @@ double Item_std_field::val()
null_value=0;
double tmp= (double) count;
double tmp2=(sum_sqr - sum*sum/tmp)/tmp;
return tmp2 <= 0.0 ? 0.0 : sqrt(tmp2);
return tmp2 <= 0.0 ? 0.0 : tmp2;
}
String *Item_std_field::val_str(String *str)
String *Item_variance_field::val_str(String *str)
{
double nr=val();
if (null_value)