我有一個 SQL Server 股票資料庫,正在嘗試計算股票的 52 周滾動最高和最低收盤價。
當使用視窗函式 MAX() 并嘗試磁區到滾動 52 周期間時,如何將磁區限制為滾動 52 周(或 1 年時間段)?
我相信我正在做的(截圖)將產生 365 個滾動觀察的滾動最大值。但由于市場在周末和節假日休市,這實際上可能與 52 周不同:
SELECT
symbol,
dates,
[close],
MAX( [close] ) OVER(PARTITION BY symbol
ORDER BY dates
ROWS BETWEEN 364 PRECEDING AND CURRENT ROW) AS [52_week_high]
FROM dbo.adj_daily_prices
WHERE
dates BETWEEN CAST('2019-01-01' AS DATE) AND CAST('2021-10-15' AS DATE)
AND
symbol = 'CLR'
AND
is_last = 1
ORDER BY
dates DESC

我想有一種聰明的方法可以用 CASE WHEN 運算式來做到這一點?
uj5u.com熱心網友回復:
您所描述的內容目前在 Microsoft SQL Server 中無法使用分析功能,但在其他資料庫中是可能的。見https://modern-sql.com/caniuse/over_range_between_(datetime)
您也可以使用同一個表的連接,并帶有日期條件:
select p.symbol,
p.dates,
p.[close],
max(h.[close]) as [52_week_high],
min(h.[close]) as [52_week_low]
from adj_daily_prices p
join adj_daily_prices h
on p.symbol = h.symbol
and h.dates between dateadd(year,-1,p.dates) and p.dates
where p.dates between '2019-01-01' and '2021-10-15'
and p.symbol = 'CLR'
group by p.symbol,
p.dates,
p.[close]
order by p.dates desc;
uj5u.com熱心網友回復:
通過“主查詢”,我指的是回傳結果的最后一步。但無論如何,我現在明白您不希望將解決方案限制為 1 年,因此,我相信這個更接近您所尋求的。沒有 CTE 或日歷表,而只是作為選擇列運算式的子查詢。不限一年。
(我不知道你的is_last列是做什么的,所以我只是包含了 is_last=1 認為它可能標記了每個符號和日期的最新行)
with
adj_daily_prices as ( -- this simulates your table
select *
from (values
('CLR', '2021-01-01', 58, 1)
, ('CLR', '2019-04-05', 70, 1)
, ('CLR', '2021-01-05', 56, 1)
, ('CLR', '2021-02-15', 60, 1)
) T(symbol, dates, [close], is_last)
)
SELECT
symbol,
dates,
[close],
(select max([close])
from adj_daily_prices ftWkh
where ftWkh.symbol=adp.symbol
and is_last=1
and ftWkh.dates between dateadd(week, -52, adp.dates) and adp.dates
) AS [52_week_high]
FROM
adj_daily_prices adp
WHERE
adp.dates BETWEEN CAST('2019-01-01' AS DATE) AND CAST('2021-10-15' AS DATE)
AND
symbol = 'CLR'
AND
is_last = 1
ORDER BY
adp.dates desc
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384640.html
標籤:sql sql-server 查询语句 滚动计算
上一篇:當變數不為空時如何只運行左連接?
下一篇:根據時間段查找一列不同的重復行
