2010-09-16 106 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