Каждую секунду котировки акций сервера sql - PullRequest
0 голосов
/ 16 сентября 2010

У меня есть таблица с котировками акций

Символ
Спросите
Bid
QuoteDateTime

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

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

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

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

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

Символ 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

и т.д.

1 Ответ

0 голосов
/ 16 сентября 2010

Вот один из способов.Треугольное соединение также может быть использовано.Интересно, есть ли другие варианты?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...