2014-10-18 105 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