sql - 如何在 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。
解决方案
你不只是想要MAX(时间)吗?
SELECT MAX(time) AS time
, avg(value)
FROM table
GROUP BY CEIL(time/ 300)
ORDER BY time ASC
;
为了完整起见,我们应该提到原始查询是无效的(根据标准 SQL),即使 MariaDB 可以配置为允许它。
原因是time
在select list
功能上不依赖于GROUP BY
条款CEIL(time/300)
。
解决方案中的选择MAX(time) AS time
更正了上述函数依赖问题,也更正了尝试使用时类似ORDER BY time
的问题,这也是原始查询中的问题。
推荐阅读
- ios - 将字典拆分为键数组和值数组
- google-chrome - 在网页抓取和 Puppeteer 方面,Chrome 和 Chromium 有什么区别?
- html - 如何创建页面特定链接
- reactive-programming - Flux 默认已经是顺序的,为什么还要使用 Schedulers.single(customScheduler)?
- linux - Linux 内核 conntrack 丢弃统计
- r - 删除字符串向量中带有空字符“”的元素
- laravel - 如何最大化内存以在 Laravel 中由工厂生成大量数据?
- delphi - 如何用多个字段填充组合框?
- javascript - 覆盖 JavaScript 提供的 CSS 格式
- scala - 如何在不分配给 val 的情况下使用隐式调用返回的函数