在sql中为列获取不正确的AVG()值

时间:2017-02-02 06:48:15

标签: mysql sql hiveql

我正在编写一个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。我不确定我做错了什么。关于我缺少什么的任何指示?

感谢。

4 个答案:

答案 0 :(得分:5)

为了便于理解,我已经开始在这里以可视方式创建您的表格。 Nums a 看起来像

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

您使用 b 别名的子选择中的表格如

+ ------------------------- +
| 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
        )

答案 1 :(得分: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

答案 2 :(得分:0)

unsigned int

答案 3 :(得分: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;