基于平均排名的MySQL排名

时间:2020-10-16 11:47:02

标签: mysql

我有一个包含这些列的表

-----------------------------------------------------------------------
|id | deviceId | totalMethaneInGrams | totalFeedInMinutes | date      |
-----------------------------------------------------------------------
|1  |141       | 402                 |305                 |2020-10-13 | 
|2  |141       | 410                 |368                 |2020-10-13 | 
|3  |145       | 361                 |300                 |2020-10-13 |
----------------------------------------------------------------------- 

现在,我想为设备子集计算 totalMethaneInGrams totalFeedInMinutes 的平均值。日期少于某天的地方。将它们按devicedId分组,按avg(totalMethaneInGrams)对其进行排序,然后根据avg(totalMethaneInGrams)获得这些设备的全局排名。

这是我到目前为止所拥有的,

SELECT
    deviceId,
    ROUND(avg(totalFeedInMinutes),2) as methane,
    ROUND(avg(totalMethaneInGrams)) as feed
FROM sensor_data 
WHERE
    deviceId IN (141,123,145) AND date < '2020-10-14' 
GROUP BY deviceId 
ORDER BY methane

现在我不明白的是如何计算全球排名。我的理解是我们需要计算表中所有设备的排名。然后,我可以在返回的全局数据集中搜索设备。可以在单个查询中完成吗?

1 个答案:

答案 0 :(得分:0)

mysql不能很好地对多列进行排名(例如,甲烷中的进料),一种解决方法是单独进行并加入

SELECT  t.deviceId,
    ROUND(avg(totalMethaneInGrams),2) methane,
    rank() over (order by ROUND(avg(totalMethaneInGrams),2 ) desc) as rankmethane,
    max(feed) feed,
    max(rankfeed) rankfeed
fROM t
join
(SELECT
    deviceId,
    ROUND(avg(totalFeedInMinutes)) as feed,
     rank() over (order by ROUND(avg(totalFeedInMinutes),2 ) desc) as rankfeed
fROM t
WHERE deviceId IN (141,123,145) AND date < '2020-10-14'
group by deviceid) s
on s.deviceid = t.deviceid
WHERE t.deviceId IN (141,123,145) AND date < '2020-10-14' 
GROUP BY t.deviceId ;

+----------+---------+-------------+------+----------+
| deviceId | methane | rankmethane | feed | rankfeed |
+----------+---------+-------------+------+----------+
|      141 |  406.00 |           1 |  337 |        2 |
|      145 |  361.00 |           2 |  400 |        1 |
+----------+---------+-------------+------+----------+
2 rows in set (0.002 sec)
相关问题