我正在编写一个查询来查找表中的中位数。该表有一列包含从1到106的连续自然数。
CREATE TABLE med
AS (SELECT rs
FROM ( SELECT rownum rs
FROM employees
WHERE employee_id<=106));
我成功执行了查询,找到这106个自然数的中位数为53.5
SELECT AVG(median)
FROM (
SELECT a.rs median
FROM med a,
med b
GROUP BY a.rs
HAVING SUM(CASE
WHEN b.rs<=a.rs THEN 1
ELSE 0
END)>=(COUNT(*)/2)
AND SUM(CASE
WHEN b.rs>=a.rs THEN 1
ELSE 0
END)>=(COUNT(*)/2));
但是在不使用子查询的情况下使用聚合函数AVG:
SELECT AVG(a.rs) median
FROM med a,
med b
GROUP BY a.rs
HAVING SUM(CASE
WHEN b.rs<=a.rs THEN 1
ELSE 0
END)>=(COUNT(*)/2)
AND SUM(CASE
WHEN b.rs>=a.rs THEN 1
ELSE 0
END)>=(COUNT(*)/2)
然后它没有给出53.5的预期输出,而是给出53,54的输出。为什么呢?
答案 0 :(得分:0)
那是因为在您使用子查询的第一个查询中,您正在计算值53和54之间的平均值。
在没有子查询的第二个查询中,执行聚合函数,但是对每个值分别执行,这意味着AVG(53)和AVG(54)。这就是为什么你要回2行。
我希望你能清楚。