使用 Group by 进行多次聚合计算
Posted
技术标签:
【中文标题】使用 Group by 进行多次聚合计算【英文标题】:Multiple aggregate calculations using Group by 【发布时间】:2021-03-12 23:23:30 【问题描述】:我有一个数据集 df1,我想在其中:
-
根据对 TotalB 列的分组取 TotalB 列的平均值。
然后我想取这个新列并减去空闲值以获得使用值
df1
date name rack TotalB freeB
11/20/2020 a yes 11 5
11/20/2020 a yes 10 5
11/20/2020 a yes 12 5
11/20/2020 a yes 10 5
11/20/2020 b no 5 2
11/20/2020 b no 5 2
11/20/2020 b no 6 2
期望的结果
date name rack TotalB freeB UsedB
11/20/2020 a yes 10.75 5 5.75
11/20/2020 b no 5.33 2 3.33
我在做什么:
SELECT AVG(TotalB) AS AVG_TotalB, date, name, rack, TotalB, freeB, (AVG_TotalB - freeB) AS UsedB
FROM df1
GROUP BY rack
任何建议都会有所帮助。
【问题讨论】:
【参考方案1】:您的查询似乎非常接近。大多数情况下你需要修复GROUP BY
:
SELECT date, name, rack,
AVG(TotalB) AS AVG_TotalB, freeB,
(AVG(TotalB) - freeB) AS UsedB
FROM df1
GROUP BY date, name, rack, freeB;
请注意,您不能在同一 SELECT
中重复使用列别名。您需要重复该表达式。
【讨论】:
啊,我明白了 - 让我试试这个!【参考方案2】:您需要将它们转换为 DECIMAL 以避免丢失小数部分。
DECLARE @test TABLE (dateval date, name varchar(50), rack varchar(10), TotalB int, freeB int)
INSERt INTO @test
values
('11/20/2020','a','yes', 11 ,5),
('11/20/2020','a','yes', 10 ,5),
('11/20/2020','a','yes', 12 ,5),
('11/20/2020','a','yes', 10 ,5),
('11/20/2020','b','no', 5 ,2),
('11/20/2020','b','no', 5 ,2),
('11/20/2020','b','no', 6 ,2);
SELECT dateval,name, rack, freeB, cast(AVG(cast(totalB as decimal(5,2))) as decimal(5,2)) as TotalB,
cast(AVG(cast(totalB as decimal(5,2))) as decimal(5,2)) - freeB as UsedB FROM @test
GROUP BY dateval,name, rack, freeB
+------------+------+------+-------+--------+-------+
| dateval | name | rack | freeB | TotalB | UsedB |
+------------+------+------+-------+--------+-------+
| 2020-11-20 | a | yes | 5 | 10.75 | 5.75 |
| 2020-11-20 | b | no | 2 | 5.33 | 3.33 |
+------------+------+------+-------+--------+-------+
【讨论】:
以上是关于使用 Group by 进行多次聚合计算的主要内容,如果未能解决你的问题,请参考以下文章
聚合函数以及MYSQL分组查询——GROUP BY语句(一天一个小技巧,明天你就是专业人士,欧耶!)