我在mysql中的汇总函数有问题。 例如,我有此表布局。每x分钟填充一次数据。
Company | Employee | Room | Temperature
---------------------------------------
A | Mike | 301 | 20
A | Mike | 301 | 30
A | Mike | 301 | 30
A | Mike | 402 | 40
A | Lisa | 402 | 10
现在,在查询中,我将“公司+员工”分组为一个结果,我在寻找“房间”值的最大出现次数,同时仍在汇总其他值(例如温度)。
SELECT
Company,
Employee,
??? as Room,
AVG(Temperature) as Temperature
FROM
example_table
GROUP BY
Company,
Employee
在此示例中,房间301为Mike出现了3次,应在合计函数中输出3。由于数据是按设定的时间间隔,因此基本上是该员工在房间中停留的最大时间。我正在寻找这样的结果
Company | Employee | Room | Temperature
---------------------------------------
A | Mike | 3 | 30
A | Lisa | 1 | 10
我感觉自己丢失了一些东西,但是到目前为止,我没有发现任何对我有用的查询。我可以group_concant房间,并用php中的2行代码解决这个问题,但是实际数据是千兆字节,我不想发送给脚本。数据库查询的性能无关紧要。 MySQL 8可用。
编辑:我已经更改了示例,以确保COUNT(DISTINCT Room)
不会意外给出正确的结果,因为这不是我想要的。
答案 0 :(得分:0)
SELECT Company, Employee
, MAX(roomOccurrence) AS Room
, AVG(roomTemp * roomOccurrence) AS Temperature
FROM ( SELECT Company, Employee, Room
, COUNT(*) AS roomOccurrence, AVG(Temperature) AS roomTemp
FROM example_table
GROUP BY Company, Employee, Room
) AS subQ
GROUP BY Company, Employee
;
请注意外部温度平均值权重内部查询的温度平均值。
或者,您可以对子查询中的临时值求和...然后将SUM的SUM除以房间COUNT的SUM。但是两种方法都应该相同。我充其量只能期待性能上的细微差别,并且不确定哪种方法会始终更快。