Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
金融时报系列-SQL Server-当某些列为空时,从多个列中提取有序数据_Sql_Sql Server_Null_Time Series_Financial - Fatal编程技术网

金融时报系列-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

想象一下,在一个名为tblPrices的MS SQL Server表中有以下金融交易和报价数据

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';