首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确的SQL语句返回表示前一个月到期合约的正确行

正确的SQL语句返回表示前一个月到期合约的正确行
EN

Stack Overflow用户
提问于 2011-09-12 04:04:14
回答 1查看 98关注 0票数 0

我有一个SQL server2008 R2数据库,里面有几个股票期权的交易记录,每个期权间隔一分钟,每分钟包含几个到期的记录。例如,

代码语言:javascript
复制
Symbol, TradeDate, Expiry, Open, High, Low, Close
AMZN, 4/01/2009 9:31:00, 4/17/2009, 8, 10, 9, 8.5
AMZN, 4/01/2009 9:31:00, 5/17/2009, 10, 11, 10, 11
AMZN, 4/01/2009 9:31:00, 6/18/2009, 12,13,12,12
GOOG, 4/01/2009 9:31:00, 4/17/2009, 8, 9, 7, 7.5
AMZN, 4/01/2009 9:32:00, 4/17/2009, 8.2, 8.9, 8.3, 8.5
AMZN, 4/01/2009 9:32:00, 5/16/2009, 3, 4, 4, 4
...
AMZN, 4/20/2009 9:31:00, 5/16/2009, 8.5, 9, 8.75, 8.75
AMZN, 4/20/2009 9:31:00, 6/18/2009, 9, 10, 9, 9.2

在期权中,总是有一个前月合约的概念。对于此问题,请将前一个月合约定义为:如果有TradeDate条目小于该合约的到期日,则为前一个月。否则,前一个月就是下个月的合约。例如,在上面的数据中,在2009年4月1日,AMZN前一个月是在2009年4月17日到期的合约。然而,当我们移动到TradeDate 4/20/2009时,前一个月是5/16/2009合约,因为4/17/2007合约在周末到期。

根据TradeDate是什么,哪条SQL语句总是返回所有正确的行,并给出“前一个月合约”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-12 04:40:33

从你所描述的。下面的查询应该可以做到这一点。自连接:

代码语言:javascript
复制
SELECT T1.Symbol, T1.TradeDate, T1.Expiry, MIN(T2.expiry) AS FrontMonrhContract, T1.Open, T1.High, T1.Low, T1.Close FROM <TABLE> T1, <TABLE> T2 WHERE T1.TradeDate <= T2.Expiry GROUP BY T1.Symbol , T1.TradeDate, T1.Expiry

但如果没有FrontMonth合约的交易条目,它将不起作用。

我感觉更好的是,你要么手动输入一个Expiries列表,要么根据一些规则来计算它们,比如这个月的上周五或类似的东西(如果有规则的话)。这样,如果frontMonth合约没有交易,您就不会冒着错误计算前一个月的风险。

最好还是在您的应用程序中而不是SQL中执行此操作,因为SQL不适用于此类工作。在您的应用程序中,这将是一个与过期列表的简单比较。

通过在应用程序本身而不是SQL中执行图表计算,我已经将图表函数的执行时间减少了90%以上。

更新:

尝试执行以下查询。它假定表名为TRADES。

代码语言:javascript
复制
SELECT 
    T1.Symbol, 
    T1.TradeDate, 
    T1.Expiry, 
    MIN(T2.expiry) AS 'FrontMonrhContract' ,
    MIN(T1.[Open]) AS 'Open',
    MIN(T1.[High]) AS 'High',
    MIN(T1.[Low]) AS 'Low',
    MIN(T1.[Close]) AS 'Close'
FROM 
    TRADES T1, TRADES T2 
WHERE T1.TradeDate <= T2.Expiry AND T1.Symbol = T2.Symbol
GROUP BY T1.Symbol , T1.TradeDate, T1.Expiry

我刚刚使用您在问题中提供的数据构建了一个示例表,该查询在该数据集上按预期工作。请注意,我使用的是SQL Server 2005

更新2:

要优化查询的执行,请尝试按该顺序添加具有三个GROUP BY列Symbol, TradeDate, Expiry的索引。

我创建了一个查询执行计划,超过60%的时间用于解析GROUP BY,在我的示例数据库中添加此索引后,它完全消失了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7380874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档