带有 order by 的 MySQL8 窗口函数不起作用

问题描述

我有一张这样的桌子:

+-------------------+-------------+-------+
|       monitor_time|monitor_value|content|
+-------------------+-------------+-------+
|2020-12-01 11:43:27|           20|   line|
|2020-11-03 11:43:48|           15|   line|
|2020-10-21 11:44:27|           10|   line|
|2020-10-18 11:44:27|           10|   line|
|2020-10-10 11:44:27|            8|   line|
+-------------------+-------------+-------+

我想查询当前行之间大约40天的数据对应的值(例如:38天前和41天前,以41天作为答案), 这是我的 sql

select
  first_value(monitor_value) over oldest_first as project_start_val,first_value(monitor_time) over oldest_first as project_start_time
from sub_test sm
window oldest_first as (partition by content order by abs( datediff( monitor_time,date_sub( sm.monitor_time,INTERVAL 40 DAY ) ) ) ASC )

我使用了窗口函数 按 abs( datediff( monitor_time,INTERVAL 40 DAY ) ) ) 得到答案,但我发现它不起作用,结果总是采用最大监视器时间:

+-----------------+-------------------+
|project_start_val| project_start_time|
+-----------------+-------------------+
|               20|2020-12-01 11:43:27|
|               20|2020-12-01 11:43:27|
|               20|2020-12-01 11:43:27|
|               20|2020-12-01 11:43:27|
|               20|2020-12-01 11:43:27|
+-----------------+-------------------+

正确答案应该是:

+-----------------+-------------------+
|project_start_val| project_start_time|
+-----------------+-------------------+
|               10|2020-10-21 11:44:27|
|                8|2020-10-10 11:44:27|
|                8|2020-10-10 11:44:27|
|                8|2020-10-10 11:44:27|
|                8|2020-10-10 11:44:27|
+-----------------+-------------------+

我的 sql 有什么问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)