SQL 获取接下来 n 行的最大值
假设我有一个包含两列的表:时间和值。我希望能够获得一张桌子: 每次获取接下来的 n 秒的最大值。
如果我想要每隔 3 秒的最大值,则下表:
时间 | 值 |
---|---|
1 | 6 |
2 | 1 |
3 | 4 |
4 | 2 |
5 | 5 |
6 | 1 |
7 | 1 |
8 | 3 |
9 | 7 |
应该返回:
时间 | 值 | 最大值 |
---|---|---|
1 | 6 | 6 |
2 | 1 | 4 |
3 | 4 | 5 |
4 | 2 | 5 |
5 | 5 | 5 |
6 | 1 | 3 |
7 | 1 | 7 |
8 | 3 | NULL |
9 | 7 | NULL |
有没有有没有办法直接用sql查询来做到这一点?
Say I have a table with two columns: the time and the value. I want to be able to get a table with :
for each time get the max values of every next n seconds.
If I want the max value of every next 3 seconds, the following table:
time | value |
---|---|
1 | 6 |
2 | 1 |
3 | 4 |
4 | 2 |
5 | 5 |
6 | 1 |
7 | 1 |
8 | 3 |
9 | 7 |
Should return:
time | value | max |
---|---|---|
1 | 6 | 6 |
2 | 1 | 4 |
3 | 4 | 5 |
4 | 2 | 5 |
5 | 5 | 5 |
6 | 1 | 3 |
7 | 1 | 7 |
8 | 3 | NULL |
9 | 7 | NULL |
Is there a way to do this directly with an sql query?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用
max
窗口函数:Fiddle
case 表达式检查当前行之后是否有超过 2 行来计算最大值,否则返回
null
(对于按时间排序的最后 2 行)。You can use the
max
window function:Fiddle
The case expression checks that there are more than 2 rows after the current row to calculate the max, otherwise
null
is returned (for the last 2 rows ordered by time).与 Zakaria 类似的版本,但此解决方案使用的 CPU 资源减少了约 40%(缩放至 3M 行进行基准测试),因为窗口函数都使用完全相同的 OVER 子句,因此 SQL 可以更好地优化查询。
3行滚动窗口的优化最大值
Similar Version to Zakaria, but this solution uses about 40% less CPU resources (scaled to 3M rows for benchmark) as the window functions both use the same exact OVER clause so SQL can better optimize the query.
Optimized Max Value of Rolling Window of 3 Rows