我有一个包含这些列的表
-----------------------------------------------------------------------
|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
现在我不明白的是如何计算全球排名。我的理解是我们需要计算表中所有设备的排名。然后,我可以在返回的全局数据集中搜索设备。可以在单个查询中完成吗?
答案 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)