Sql 聚合函数未按预期工作
我在写一个查询,从一个表中找出中间值。该表有一列,包含从1到106的连续自然数Sql 聚合函数未按预期工作,sql,oracle,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
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之间的平均值 在不带子查询的第二次查询中,将执行聚合函数,但它分别对每个值执行,即AVG53和AVG54。这就是为什么您要返回2行
我希望您能明白。,请提供示例数据和预期输出。@Mansoor该表有一个名为rs的单列,由1到106的连续自然数组成。列数据类型?为供将来参考,Oracle SQL提供了