This is probably not the most elegent solution, but here is something
that works in 3 SQL statements using user variables.

mysql> select @gmean := 1, @ct := count(*) from g_mean;
mysql> select @gmean := @gmean * test_val from g_mean;
mysql> select power(@gmean, (1/@ct)) as Geo_Mean;

See details below

Gordon Bruce
Interstate Software
A MySQL US Training Partner

mysql> create table g_mean (test_val float);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into g_mean values (23),(32),(12),(145),(18);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

mysql> select avg(test_val) from g_mean;
+---------------+
| avg(test_val) |
+---------------+
|            46 |
+---------------+
1 row in set (0.00 sec)

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

mysql> select @gmean := 1, @ct := count(*) from g_mean;
+-------------+-----------------+
| @gmean := 1 | @ct := count(*) |
+-------------+-----------------+
|           1 |               5 |
+-------------+-----------------+
1 row in set (0.00 sec)

mysql> select @gmean := @gmean * test_val from g_mean;
+-----------------------------+
| @gmean := @gmean * test_val |
+-----------------------------+
|                          23 |
|                         736 |
|                        8832 |
|                     1280640 |
|                    23051520 |
+-----------------------------+
5 rows in set (0.00 sec)

mysql> select power(@gmean, (1/@ct)) as Geo_Mean;
+-----------+
| Geo_Mean  |
+-----------+
| 29.685196 |
+-----------+
1 row in set (0.02 sec)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

> -----Original Message-----
> From: Andrew Gould [mailto:[EMAIL PROTECTED]]
> Sent: Saturday, May 11, 2002 7:51 AM
> To: [EMAIL PROTECTED]
> Subject: geometric mean aggregate function
> 
> Has anyone out there developed a costum, aggregate
> function for calculating the geometric mean of
> populations?  If not, would anyone be interested in
> creating one?
> 
> My development experience/skills is limited to SQL and
> simple Python scripts; so I had difficulty
> understanding the documentation on creating functions.
> 
> Why _you_ might want this function:  Geometric mean is
> a good replacement for arithmetic mean when you want
> to reduce the effects of extreme, infrequent values
> without excluding the occurrences altogether.  An
> example is Medicare's (US government health insurance
> for the elderly) use of geometric mean to derive
> standard lengths of stay (days in the hospital) for
> patients within Diagnostic Related  Groups (DRGs).
> For companies calculating statistics for internal
> process improvement projects, this function would be
> very useful because is describes what usually happens
> better than the arithmetic mean (see below).
> 
> Calculating geometric mean:
> Geometric mean is calculated by multiplying the values
> of each occurrence together and raising the resulting
> product by the power of 1 divided by the sample size.
> Therefore, the geometric mean of 2 3, 4, 5, and 40
> would be (2*3*4*5*40)^(1/5) = 5.448139855, which is
> very different from the arithmetic mean of 10.8.  I
> certainly would have liked my school grades to be
> calculated this way!
> 
> If anyone has created this function and would be
> willing to share it, I would greatly appreciate it.
> If the developers on this list see value in adding it
> as a standard function to MySQL, I think you will be
> ahead of the pack as industries are becoming more data
> savvy.
> 
> Is this a fairly simple request; or would it have been
> more appropriate to send this request to
> [EMAIL PROTECTED]?
> 
> Thanks,
> 
> Andrew Gould
> 
> __________________________________________________
> Do You Yahoo!?
> LAUNCH - Your Yahoo! Music Experience
> http://launch.yahoo.com
> 
> ---------------------------------------------------------------------
> Before posting, please check:
>    http://www.mysql.com/manual.php   (the manual)
>    http://lists.mysql.com/           (the list archive)
> 
> To request this thread, e-mail <[EMAIL PROTECTED]>
> To unsubscribe, e-mail <mysql-unsubscribe-
> [EMAIL PROTECTED]>
> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php


---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to