2010-09-16 5 views
0

У меня есть таблица с котировкой акциямиSQL Server котировка каждого второго

Символа
Задать
Bid
QuoteDateTime

Использования SQL Server 2008, позволяет сказать, что для любого 60-секундного периода времени я хочу для выбора котировок на всех символах, чтобы в течение этого периода была запись за каждую секунду.

Проблема не в том, что каждый символ имеет одинаковое количество котировок - так что есть несколько секунд, у которых нет кавычек для любого данного символа. Поэтому я хочу заполнить недостающие данные. Поэтому, если ORCL имеет котировки во втором 1, 2, 3, 5, 7, я хочу, чтобы результирующий набор имел 1,2,3,4,5,6,7 ... до 60 секунд (охватывающий всю минуту) , Значения в строке 4 взяты из строки 3

В этом случае я хотел бы выбрать предыдущую цитату и использовать ее для этой второй секунды. Таким образом, для каждого символа есть непрерывные записи, и для каждого символа выбирается одинаковое количество записей.

Я не уверен, что это называется в SQL сервере, но любая помощь строит запрос, чтобы сделать это было бы здорово

Для вывода Я ожидаю, что для любого заданного периода времени 60 сек. Для тех символов, которые имеют запись в 60 секунд, будет 60 записей для каждого символа, один для каждого второго

Symbol Ask Bid QuoteDateTime

MSFT 26.00 27.00 2010-05-20 06:28:00
MSFT 26,01 27,02 2010-05-20 06:28:01
...
ORCL 26,00 27,00 2010-05-20 06:28:00
ORCL 26,01 27,02 2010-05-20 06:28:01

и т.д.

+0

Какова точность вашего формата времени? например все значения будут равняться круглым секундам, таким как '2010-09-16 14: 59: 57.000'. Если вторая секунда может быть больше одной записи за акцию в секунду? –

+0

Можете ли вы привести примерный пример вывода? Это может помочь уточнить, что вы ожидаете. По крайней мере, я нахожу ваше объяснение немного запутанным. – InSane

+0

Точность в миллисекундах, как 2010-05-20 06: 28: 07.850, но я собирался сделать группу на втором, гарантируя, что есть только одна запись в секунду, если она существует – chrisg

ответ

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

Смежные вопросы