2014-10-18 2 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. –

+0

Сложнее выглядит предыдущий ответ ... Отличается ли этот подход лучшей работой? –

+0

Он также возвращает неверный ответ (3 для набора данных выше, а не 3.5) –

Смежные вопросы