2017-02-02 6 views
4

Я пишу sql-запрос, который будет группировать столбец и возвращать его минимальные, максимальные и средние значения. Вот что я делаю:Получение неправильного значения AVG() для столбца в sql

CREATE TABLE Nums (
patient_id VARCHAR(20), 
val DOUBLE 
); 
INSERT INTO Nums 
VALUES ("A", 100), ("A", 175), ("B", 200), ("B", 100), ("B",20), ("B",2000), ("B",4000); 

select AVG(event_count), MIN(event_count), MAX(event_count) 
from Nums a 
join (select patient_id, count(*) as event_count from Nums group by patient_id) b 
on a.patient_id = b.patient_id; 

Я получаю выход на следующий запрос, как

AVG(event_count) MIN(event_count) MAX(event_count) 
4.1429      2    5 

Я получаю правильные значения для мин и макс, но я ожидал, что среднее значение будет 3.5 , Я не уверен, что я делаю неправильно. Любые указатели на то, что мне не хватает?

Спасибо.

+0

Что вы ожидали от 'average_count'? – Sadikhasan

+0

Нечетно, что столбец с плавающей точкой будет содержать такие значения. – Strawberry

ответ

5

Для облегчения понимания я пошел дальше и визуально создал ваши таблицы. Nums выглядит

+ ---------- + ---- + 
| patient_id | val | 
+ ---------- + ---- + 
| A   | 100 | 
| A   | 175 | 
| B   | 200 | 
| B   | 100 | 
| B   | 20 | 
| B   | 2000 | 
| B   | 4000 | 
+ ---------- + ---- + 

В таблице с вашего подзапрос, который вы псевдоним с б выглядит

+ ------------------------- + 
| patient_id | event_count | 
+ ---------- + ------------ + 
| A   | 2   | 
| B   | 5   | 
+ ---------- + ------------ + 

Если внутренний присоединился к ним и выбрал все свои столбцы, вы увидите

+ ---------- + ---- + ------------ + 
| patient_id | val | event_count | 
+ ---------- + ---- + ------------ + 
| A   | 100 | 2   | 
| A   | 175 | 2   | 
| B   | 200 | 5   | 
| B   | 100 | 5   | 
| B   | 20 | 5   | 
| B   | 2000 | 5   | 
| B   | 4000 | 5   | 
+ ---------- + ---- + ------------ + 

Когда вы в среднем, вы делаете 29/7 = 4.1429.

Мне кажется, что вы просто хотите, чтобы усреднить цифры 2 и 5, что ваш подвыборкой стол, так что я хотел бы сделать что-то вроде

select AVG(event_count), MIN(event_count), MAX(event_count) 
    from (
     select patient_id, count(*) as event_count 
      from Nums 
      group by patient_id 
     ) 
+0

Это сработало. Спасибо за подробное объяснение. – Tontodoin

0
select AVG(event_sum), MIN(event_count), MAX(event_count) 
from Nums a 
join (select patient_id, count(*) as event_count,sum(val) as event_sum from Nums group by patient_id) b 
on a.patient_id = b.patient_id; 
1

Попробуйте

SELECT AVG(event_count),MIN(event_count), MAX(event_count) 
FROM(
    SELECT patient_id, count(*) as event_count 
    FROM Nums GROUP BY patient_id 
)M 
+0

Спасибо, что это работает! – Tontodoin

0

Да, Вы можете использовать этот запрос, я думаю, вы получите ожидаемый результат

select AVG(DISTINCT event_count), MIN(event_count), MAX(event_count) 
from Numstest a 
join (select patient_id, count(*) as event_count from Numstest group by patient_id) b 
on a.patient_id = b.patient_id; 
Смежные вопросы