2014-10-18 107 views
0

我在我的表中的以下數據:平均數及中位數在SQL Server一個查詢2012

SELECT category, value FROM test 
 
| category | value | 
+----------+-------+ 
| 1  | 1 | 
| 1  | 3 | 
| 1  | 4 | 
| 1  | 8 | 

現在我使用兩個單獨的查詢。

  1. 爲了得到平均:

    SELECT category, avg(value) as Average 
        FROM test 
    GROUP BY category 
    

     
    | category | value | 
    +----------+-------+ 
    | 1  | 4 | 
    

  2. 要獲得中位數:

    SELECT DISTINCT category, 
           PERCENTILE_CONT(0.5) 
            WITHIN GROUP (ORDER BY value) 
            OVER (partition BY category) AS Median 
          FROM test 
    

     
    | category | value | 
    +----------+-------+ 
    | 1  | 3.5 | 
    

有什麼辦法可以將它們合併到一個查詢中嗎?

注意:我知道我也可以通過兩個子查詢獲得中值,但我更喜歡使用PERCENTILE_CONT函數來獲取它。

回答

6

AVG也是一個窗口函數:

select 
distinct 
category, 
avg(value) over (partition by category) as average, 
PERCENTILE_CONT(0.5) 
        WITHIN GROUP (ORDER BY value) 
        OVER (partition BY category) AS Median 
        from test 
0

我會在一個稍微不同的方式處理這個:

select category, avg(value) as avg, 
     avg(case when 2 * seqnum in (cnt, cnt + 1, cnt + 2) then value end) as median 
from (select t.*, row_number() over (partition by category order by value) as seqnum, 
      count(*) over (partition by category) as cnt 
     from test t 
    ) t 
group by category; 
+0

還是要GROUP BY類別在年底的AVG功能。 – 2014-10-18 23:18:26

+0

以前的答案看起來更復雜......這種方法是否有更好的性能? – 2014-10-18 23:19:34

+0

它也會返回錯誤的答案(對於上面的數據集而不是3.5) – 2014-10-18 23:19:58