归墟
业精于勤,荒于嬉!

算中位数
要算出中位数,我们必须要能够达成以下几个目标:
将资料依序排出,并找出每一行资料的排名。
找出『中间』的排名为何。举例来说,如果总共有 9 笔资料,那中间排名就是 5 (有 4 笔
资料比第 5 笔资料大,有 4 笔资料比第 5 笔资料小)。
找出中间排名资料的值。
来看看以下的例子。假设我们有以下的表格:
Total_Sales 表格
Name           Sales
John              10
Jennifer          15
Stella               20
Sophia              40
Greg                 50
Jeff                    20
要找出中位数,我们就键入:
SELECT Sales Median FROM
(SELECT a1.Name, a1.Sales, COUNT(a1.Sales) Rank
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales < a2.Sales OR (a1.Sales=a2.Sales AND a1.Name <= a2.Name)
group by a1.Name, a1.Sales
order by a1.Sales desc) a3
WHERE Rank = (SELECT (COUNT(*)+1) DIV 2 FROM Total_Sales);
结果:
Median
20
发现,第 2 行到第 6 行是跟产生 排名 的语句完全一样。第 7 行则是算出中间
的排名。DIV 是在 MySQL 中算出商的方式。在不同的数据库中会有不同的方式求商。第 1
行则是列出排名中间的资料值。
算累积总计
算出累积总计是一个常见的需求,可惜以 SQL 并没有一个很直接的方式达到这个需求。要
以 SQL 算出累积总计,基本上的概念与列出排名类似:第一是先做个表格自我连结 (self
join),然后将结果依序列出。在做列出排名时,我们算出每一行之前 (包含那一行本身) 有
多少行数;而在做累积总计时,我们则是算出每一行之前 (包含那一行本身) 的总合。
来看看以下的例子。假设我们有以下的表格:
Total_Sales 表格
Name                  Sales
John                   10
Jennifer             15
Stella                20
Sophia               40
Greg                  50
Jeff                    20
要算出累积总计,我们就键入:
SELECT a1.Name, a1.Sales, SUM(a2.Sales) Running_Total
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;
结果:
Name Sales Running_Total
Greg 50 50
Sophia 40 90
Stella 20 110
Jeff 20 130
Jennifer 15 145
John 10 155
在以上的 SQL 语句中, WHERE 子句和 ORDER BY 子句让我们能够在有重复值时能够
算出正确的累积总计。

posted on 2012-06-12 10:39  Crazy-H  阅读(772)  评论(0编辑  收藏  举报