2017-03-20 59 views
0

我在寫一個查詢來查找表中的中位數。該表有一個單一的柱包括從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

,提供您的樣本數據和預期輸出。 – Mansoor

+0

@Mansoor該表有一個名爲rs的單個列,它包含從1到106的連續自然數。 – PiyushM

+0

列數據類型? – jarlh

回答

0

那是因爲你和子查詢第一個查詢,你計算的值53和54

關於你的第二查詢之間的平均無子查詢的聚合功能被執行,但它是在每個值separatly進行,意義AVG(53)和AVG(54)。這就是爲什麼你要回2行。

我希望你很清楚。

相關問題