金融时报系列-SQL Server-当某些列为空时,从多个列中提取有序数据
想象一下,在一个名为tblPrices的MS SQL Server表中有以下金融交易和报价数据金融时报系列-SQL Server-当某些列为空时,从多个列中提取有序数据,sql,sql-server,null,time-series,financial,Sql,Sql Server,Null,Time Series,Financial,想象一下,在一个名为tblPrices的MS SQL Server表中有以下金融交易和报价数据 SeqNo Ticker TradeType JulianTime Price BidPrice AskPrice 1 CLK4 Quote 735706.11 NULL 103 NULL 2 CLK4 Quote 7357
SeqNo Ticker TradeType JulianTime Price BidPrice AskPrice
1 CLK4 Quote 735706.11 NULL 103 NULL
2 CLK4 Quote 735706.59 NULL NULL 105
3 CLK4 Trade 735706.59 103 NULL NULL
NULL用于保存表中的空间。
在提取价值为“Trade”的“TradeType”数据时,我还想提取最近的数据
“BidPrice”和“AskPrice”,基于JulianTime,它们不为空
即。
上述序号3的输出可能为:
JulianTime TradeType Price BidPrice AskPrice
735706.59 Trade 103 103 105
注:SeqNo是步长1的标识。JulianTime是MATLAB发明的日期时间数值
我怎样才能做到这一点?您有一个错误的想法-与不允许空值的等效设计相比,空值消耗更多的空间和CPU。股票行情器上的每个勾号都记录了一个动作,该动作只是出价、询问和销售中的一个动作,因此需要适当的表格设计
SELECT Ticker,
Min(CASE
WHEN TradeType = 'Trade'
AND Price IS NOT NULL THEN JulianTime
END),
Min(Price),
Min(BidPrice),
Max(AskPrice)
FROM tblPrices
GROUP BY Ticker
CREATE TABLE tblPrices(
ID int identity not null primary key
,Ticker varchar(10) not null references tblTicker(Code)
,TradeType char(3) not null -- must be one of BID, ASK, SLD
,JulianTime datetime not null
,Price money not null
)
使用此表设计,您的查询变得
elect
JulianTime
,Price
,(select top 1 Price
from tblPrices bid
where bid.JulianTime < sld.JulianTime
and bid.Ticker = sld.Ticker
and bid.TradeType = 'BID'
order by JulianTime desc
) as BidPrice
,(select top 1 Price
from tblPrices bid
where bid.JulianTime < sld.JulianTime
and bid.Ticker = sld.Ticker
and bid.TradeType = 'ASK'
order by JulianTime desc
) as AskPrice
from tblPrices sld
where sld.TradeType = 'SLD';
您的示例数据与所需的结果不完全匹配。@Gidil:谢谢您格式化查询!谢谢。
elect
JulianTime
,Price
,(select top 1 Price
from tblPrices bid
where bid.JulianTime < sld.JulianTime
and bid.Ticker = sld.Ticker
and bid.TradeType = 'BID'
order by JulianTime desc
) as BidPrice
,(select top 1 Price
from tblPrices bid
where bid.JulianTime < sld.JulianTime
and bid.Ticker = sld.Ticker
and bid.TradeType = 'ASK'
order by JulianTime desc
) as AskPrice
from tblPrices sld
where sld.TradeType = 'SLD';