聚合函数无法按预期工作

时间:2017-03-20 06:00:44

标签: sql oracle

我正在编写一个查询来查找表中的中位数。该表有一列包含从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的输出。为什么呢?

1 个答案:

答案 0 :(得分:0)

那是因为在您使用子查询的第一个查询中,您正在计算值53和54之间的平均值。

在没有子查询的第二个查询中,执行聚合函数,但是对每个值分别执行,这意味着AVG(53)和AVG(54)。这就是为什么你要回2行。

我希望你能清楚。