MySQL:最大不同值发生次数

时间:2019-05-01 23:01:01

标签: mysql sql

我在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)不会意外给出正确的结果,因为这不是我想要的。

1 个答案:

答案 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。但是两种方法都应该相同。我充其量只能期待性能上的细微差别,并且不确定哪种方法会始终更快。