我有一个名为“毕业生”的表格,记录不同毕业生的姓名和收入。现在我需要计算收入的中位数。这是一本书的代码。
我的问题是
有从句的结果是什么?
自连接的结果是什么?
SELECT AVG(DISTINCT income)
FROM (
SELECT T1.income
FROM Graduates T1, Graduates T2
GROUP BY T1.income
HAVING SUM(CASE WHEN T2.income >= T1.income THEN 1 ELSE 0 END)
>= COUNT(*) / 2
AND SUM(CASE WHEN T2.income <= T1.income THEN 1 ELSE 0 END)
>= COUNT(*) / 2
) TMP;
1条答案
按热度按时间prdp8dxp1#
代码所做的是找到一个或两个中间值。它是通过计算大于或小于该值的值的数目来实现的。
每个
SUM()
他在房间里HAVING
子句计算大于或小于给定值的值的数目income
. 这个表达式所做的是这样说:中间值是指具有相同数量的大于或小于自身的值。
中位数就是中间值的平均值。如果有,那么平均值就是值本身。如果有两个,平均值就是中间值。
这很糟糕,原因有很多:
它只对数值有效。但是中位数也被定义为字符串和日期。
它需要一个自连接,这是昂贵的。
这是相当难以理解的。
如何在组内而不是在整个数据集上获取中间值并不明显。