首页 > 解决方案 > 如何在 GROUP BY 中选择其他行

问题描述

抱歉标题不好。我不知道如何更好地总结它。我有一个带有 unix 时间戳和其他值的表,如下所示。

时间 价值
1620916380 110
1620916440 100
1620916500 120
1620916560 120
1620916660 90

条目总是相隔一分钟。我想将条目分组为 5 分钟的块,并取平均值。目前我使用这个:

SELECT time, avg(value)
FROM table
GROUP BY CEIL(time/ 300)
ORDER BY time ASC;

结果:

时间 平均(价值)
1620916380 108

因此,第一次出现的时间被显示出来。我希望显示最后一个:

时间 平均(价值)
1620916660 108

我怎样才能做到这一点?我使用 MariaDB。

标签: sqlgroup-bymariadb

解决方案


你不只是想要MAX(时间)吗?

SELECT MAX(time) AS time
     , avg(value)
  FROM table
 GROUP BY CEIL(time/ 300)
 ORDER BY time ASC
;

为了完整起见,我们应该提到原始查询是无效的(根据标准 SQL),即使 MariaDB 可以配置为允许它。

原因是timeselect list功能上不依赖于GROUP BY 条款CEIL(time/300)

解决方案中的选择MAX(time) AS time更正了上述函数依赖问题,也更正了尝试使用时类似ORDER BY time的问题,这也是原始查询中的问题。


推荐阅读