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)
尝试这个 :
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_date
GROUP BY
MIN()
结果 :
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)