[英]Aggregate function not working as expected
我正在编写查询以从表中查找中位数。 该表具有包含从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的输出。为什么会这样呢?
这是因为在使用子查询的第一个查询中,您正在计算值53和54之间的平均值。
在没有子查询的第二个查询上,将执行聚合函数,但是会分别对每个值执行聚合函数,这意味着AVG(53)和AVG(54)。 这就是为什么您要返回两行的原因。
希望您明白。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.