一千萬個為什麽

搜索

在SQL中查找本地最大值和局部最小值

為了找到股票價格與時間圖表的最大虧損,您首先必須找到給定價格和天數的所有局部最大值(峰值)和局部最小值(谷值)。你會如何在SQL Server 2005中做到這一點?

編輯: 使用遊標有一種蠻力的方式: 比較第一天的高點和第二天的高點。 如果第一天的高點高於第二天的高點,則第一天的高點是當地的Max。

實際上,我需要找到價格圖表趨勢改變方向的每個點。

edit2:我應該註意到要使用的數據庫表具有以下列:

stockid int
  日期
  嗨int - 這是便士
  低int - 也是便士
  因此,對於給定的日期範圍,您將在該日期範圍內每天看到相同的stockid。

最佳答案

好的,這裏一步一步是我的想法:

1 - 查找所有“峰值”,這些峰值是第二天LOWER最大值的最大值:

DECLARE @HiTable (hi int, day date)

INSERT INTO @HiTable
SELECT hi, day
FROM table t1
WHERE EXISTS (
 SELECT t2.hi
 FROM Table t2
 WHERE t1.hi > t2.hi AND t1.day < t2.day and StockID = X)

2 - 找到你所有的“山谷”,它們是第二天具有更高最小值的最小值:

DECLARE @LowTable (low int, day date)

INSERT INTO @LowTable
SELECT low, day
FROM table t1
WHERE EXISTS (
 SELECT t2.low
 FROM Table t2
 WHERE t1.low < t2.low AND t1.day < t2.day and StockID = X)

3 - 將這些組合成一個按日期排序的表格,其中包含一個標識值,以使我們保持秩序

DECLARE @TableVar (low int, hi int, day date, autoid int IDENTITY)
INSERT INTO @TableVar
(SELECT low, hi, day
FROM (
 SELECT Low, NULL as 'hi', date FROM @LowTable
 UNION ALL
 SELECT NULL as 'Low', hi, date FROM @HiTable
 )
ORDER BY DATE)

4 - 刪除異常值

DELETE FROM @TableVar WHERE AutoID > (SELECT MAX(AutoID) FROM @Table WHERE low IS NULL)
DELETE FROM @TableVar WHERE AutoID < (SELECT MIN(AutoID) FROM @Table WHERE hi IS NULL)

轉載註明原文: 在SQL中查找本地最大值和局部最小值