[Id] [nvarchar](64) NOT NULL,
[Symbol] [nvarchar](64) NOT NULL,
[Exchange] [nvarchar](50) NOT NULL,
[Date] [date] NOT NULL,
[Open] [decimal](18, 4) NOT NULL,
[High] [decimal](18, 4) NOT NULL,
[Low] [decimal](18, 4) NOT NULL,
[Close] [decimal](18, 4) NOT NULL,
[Volume] [int] NOT NULL,
[Timestamp] [datetime2](7) NOT NULL
我有如上所述存储的库存时间序列数据库(上面还有一个屏幕截图,请点击股票价格示例),8000个符号的时间范围大约是一年。
我正在尝试根据5天的价格下降来过滤符号。
例如:
如果符号A的收盘价比符号" SPY"下跌了15%,请选择符号A. (我在这里选择SPY作为基准)过去5个日历日(包括周末) 如果SPY在过去5个日历日内上涨了7%,那么如果一个符号在同一时期内下降了8%或更多,那么它将被选中。我想为每一行应用这个crieria(这意味着每天在数据库中的每个符号)
伪代码就像:
if (SPY_2018_03_07 - SPY_2018_03_03)/(SPY_2018_03_03) -
(stock_A_2018_03_07 - stock_A_2018_03_03)/(stock_A_2018_03_03) >= 15%
Then Select stock_A
但我仍然坚持如何使用SQL查询来应用此条件。我使用的是SQL Server 2017.有没有人能帮到我?谢谢你们。
答案 0 :(得分:0)
嗯,这里实际上有两个问题。
您不具备列中所需的所有值。这意味着计算每行所需的内容会很痛苦。您可以在此处执行的操作是将5天的收盘价值转换为列。你的标题应该是这样的:
符号,兑换,日期,打开,高,低,关闭,Close_D5,量
为了更好地理解,我把这部分分为3部分(我没有测试那些查询,他们可能有一些sintax错误):
SELECT
EXCHANGE,SYMBOL,DATE,CLOSE
ROW_NUMBER() OVER(PARTITION BY EXCHANGE,SYMBOL,DATE ORDER BY EXCHANGE,SYMBOL,DATE ASC) AS ROW_NUM,
name, recovery_model_desc
INTO #TEMP
FROM <TABLE>
SELECT
EXCHANGE,SYMBOL,DATE,
CLOSE,
CLOSE_5 = (SELECT CLOSE FROM #TEMP WHERE ROW_NUM = (t.ROW_NUM - 5))
INTO #TEMP2
FROM <TABLE> t
SELECT CLOSE -CLOSE_5 FROM #TEMP3
您需要在多个步骤中创建此过滤器。我建议你制作一个存储过程来传递你需要的参数并返回结果,如果你这样做,你可以更好地调整你的策略。查询应如下所示:
DECLARE @INCREASED_VALUE DECIMAL(10,2)
SET @INCREASED_VALUE = (SELECT CLOSE-CLOSE_D5/CLOSE_D5 FROM <TABLE> WHERE SYMBOL = 'BASE_SYMBOL')
现在您需要做的就是按照您想要的方式过滤表格:
IF(@INCREASED_VALUE > 8)
BEGIN
SELECT SYMBOL,DATE,EXCHANGE
FROM <TABLE>
WHERE @INCREASED_VALUE -CLOSE-CLOSE_D5/CLOSE <= 15
END
此查询应该为您提供所有符合条件的日期和符号。