2010-09-16 108 views
0

我有股票的表报价SQL Server的股票报价每秒

符号

投标
QuoteDateTime

使用SQL Server 2008,可以说为我想任何在六十秒时间在所有符号上选择引号,以便在该时间段内每秒都有记录。

问题并非每个符号都具有相同的引号数量 - 因此有几秒钟的时间内没有任何给定符号的引用记录。所以我想填补数据漏洞。所以如果ORCL在第1,2,3,5,7部分有引号,我希望结果集有1,2,3,4,5,6,7 ...最多60秒(覆盖整个分钟) 。第4行的值来自第3行

在这种情况下,我想选择以前的报价并使用该报价。因此每个符号都有连续的记录,每个符号选择相同数量的记录。

我不知道这就是所谓的SQL服务器,但任何构建查询做到这帮助将是巨大的

对于输出我期待,对于任何给定的60秒时间。对于那些必须在60秒的记录符号,将有60条记录每一个符号,每一个第二

符号要求Bid QuoteDateTime

MSFT 26.00 27.00 2010-05-20 6时28分00秒
MSFT 26.01 27.02 2010-05-20 6时28分01秒
...
ORCL 26.00 27.00 2010-05-20 6点28分00秒
ORCL 26.01 27.02 2010-05-20 6时28分01秒

etc

+0

你的时间格式的精度是多少?例如将所有的值都舍入为秒,如'2010-09-16 14:59:57.000'。如果亚秒能够每秒有多于一个的记录? – 2010-09-16 14:01:51

+0

你能给出一个输出示例吗?这可能有助于更好地阐明你的期望。至少我发现你的解释有点混乱。 – InSane 2010-09-16 14:05:50

+0

精度是毫秒,如2010-05-20 06:28:07.850但我打算做第二组确保每秒只有一个记录,如果它存在 – chrisg 2010-09-16 14:09:13

回答

0

这是一种方法。三角形连接也可以使用。想知道有没有其他的选择?

DECLARE @startTime DATETIME = '2010-09-16 14:59:00.000'; 

WITH Times AS 
(
SELECT @startTime AS T 
UNION ALL 
SELECT DATEADD(SECOND,1, T) FROM Times 
WHERE T < DATEADD(MINUTE,1,@startTime) 
), 
Stocks AS 
(
SELECT 'GOOG' AS Symbol 
UNION ALL 
SELECT 'MSFT' 
), 
Prices AS 
(
SELECT 'GOOG' AS Symbol, 1 AS Ask, 1 AS Bid, 
     CAST('2010-09-16 14:59:02.000' AS DATETIME) AS QuoteDateTime 
UNION ALL 
SELECT 'GOOG' AS Symbol, 1 AS Ask, 1 AS Bid, 
     CAST('2010-09-16 14:59:02.000' AS DATETIME) AS QuoteDateTime 
UNION ALL 
SELECT 'GOOG' AS Symbol, 1 AS Ask, 1 AS Bid, 
     CAST('2010-09-16 14:59:02.000' AS DATETIME) AS QuoteDateTime 
UNION ALL 
SELECT 'MSFT' AS Symbol, 1 AS Ask, 1 AS Bid, 
     CAST('2010-09-01 12:00:00.000' AS DATETIME) AS QuoteDateTime 
) 
SELECT p.Symbol, p.Ask, p.Bid, p.QuoteDateTime 
FROM Times t CROSS JOIN Stocks s 
CROSS APPLY 
(SELECT TOP 1 p.Symbol, p.Ask, p.Bid, p.QuoteDateTime 
FROM Prices p 
WHERE s.Symbol = p.Symbol AND p.QuoteDateTime <= t.T) p 
+0

谢谢我试图澄清更多在我的在上面发帖 – chrisg 2010-09-16 14:28:47