mysql – 为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.我不确定我做错了什么.关于我缺少什么的任何指示?
谢谢.
解决方法:
为了便于理解,我已经在这里以可视方式创建了您的表格. Nums看起来像
+ ---------- + ---- +
| 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
)
标签:mysql,sql,hiveql 来源: https://codeday.me/bug/20190527/1164771.html