算中位数
要算出中位数,我们必须要能够达成以下几个目标:
将资料依序排出,并找出每一行资料的排名。
找出『中间』的排名为何。举例来说,如果总共有 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 子句让我们能够在有重复值时能够
算出正确的累积总计。