从滚动最大值检索日期

Nas*_*ici 5 sql t-sql sql-server over-clause window-functions

我有一个带有日期 ( session_date) 和值 ( price) 的 SQL Server 表。

会话日期 价格
2022-12-31 10
2022-12-30 9
2022年12月29日 5
2022年12月28日 7
2022年12月27日 2
2022-12-26 9
2022年12月25日 3
2022年12月24日 1

我想计算最后 3 行(日期)的滚动最大值并检索与每个最大值关联的 session_date:

会话日期 价格 滚动最大 滚动最后日期
2022-12-31 4 9 2022年12月29日
2022-12-30 4 9 2022年12月29日
2022年12月29日 9 9 2022年12月29日
2022年12月28日 7 7 2022年12月28日
2022年12月27日 2 4 2022-12-26
2022-12-26 4 4 2022-12-26
2022年12月25日 3 3 2022年12月25日
2022年12月24日 1 1 2022年12月24日

我正在使用此查询来计算滚动最大值,但如何获取关联的session_date

select session_date
, price
, max(price) over (order by session_date rows between 3 preceding and current row) as rolling_max
from my_table
Run Code Online (Sandbox Code Playgroud)

Sel*_*azi 1

尝试这个 :

with cte as (
  select session_date
  , price
  , max(price) over (order by session_date rows between 3 preceding and current row) as rolling_max  from my_table
)
select c.*, t.session_date as rolling_last_date
from cte c
inner join (
  select price, min(session_date) as session_date
  from my_table t
  group by price
) t on t.price = c.rolling_max 
order by session_date desc
Run Code Online (Sandbox Code Playgroud)

为了得到你必须使用和将你的结果与价格rolling_last_date最小的列表结合起来session_dateGROUP BYMIN()

结果 :

session_date    price   rolling_max rolling_last_date
2022-12-31      4       9           2022-12-29
2022-12-30      4       9           2022-12-29
2022-12-29      9       9           2022-12-29
2022-12-28      7       7           2022-12-28
2022-12-27      2       4           2022-12-26
2022-12-26      4       4           2022-12-26
2022-12-25      3       3           2022-12-25
2022-12-24      1       1           2022-12-24
Run Code Online (Sandbox Code Playgroud)

演示在这里