Напишите sql для обновления данных на основе времени - PullRequest
1 голос
/ 05 мая 2010

Поскольку я новичок в SQL Server и T-SQL, поэтому мне понадобится ваша помощь.

У меня есть 2 таблицы: в реальном времени и EOD. Чтобы понять мой вопрос, я привожу пример данных для 2 таблиц:

--- Таблица в реальном времени ---

Symbol     Date            Value
ABC     1/3/2009 03:05:01   327   // this day is not existed in EOD -> inserting
BBC     1/3/2009 03:05:01   458   // this day is not existed in EOD -> inserting
ABC     1/2/2009 03:05:01   326   // this day is new -> updating
BBC     1/2/2009 03:05:01   454   // this day is new -> updating
ABC     1/2/2009 02:05:01   323
BBC     1/2/2009 02:05:01   453
ABC     1/2/2009 01:05:01   313
BBC     1/2/2009 01:05:01   423

--- таблица EOD ---

Symbol     Date            Value
ABC     1/2/2009 02:05:01   323
BBC     1/2/2009 02:05:01   453

Мне нужно будет создать процедуру хранения, чтобы обновить значение символов. Если данные в день символа являются новыми (сравните данные в реальном времени и EOD), они обновят значение и дату EOD в тот день, если они существуют, и вставят в противном случае.

И магазин обновит таблицу EOD новыми данными:

--- таблица EOD ---

Symbol     Date            Value
ABC     1/3/2009 03:05:01   327
BBC     1/3/2009 03:05:01   458
ABC     1/2/2009 03:05:01   326
BBC     1/2/2009 03:05:01   454

P / S: я использую SQL Server 2005. У меня есть похожий ответ на вопрос здесь: Помощь в способе написания запроса для требования

Пожалуйста, помогите мне. Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 мая 2010

2 шага:

UPDATE      EOD
SET         EOD.Value = REALTIME.Value
FROM        EOD
INNER JOIN  REALTIME
ON          EOD.Symbol = REALTIME.Symbol
AND         EOD.Date = REALTIME.Date

INSERT INTO EOD ( Symbol , Date , Value )
SELECT        REALTIME.Symbol
            , REALTIME.Date
            , REALTIME.Value
FROM        EOD
LEFT JOIN   REALTIME
ON          EOD.Symbol = REALTIME.Symbol
AND         EOD.Date = REALTIME.Date
WHERE       EOD.Symbol IS NULL
AND         EOD.Date IS NULL

Это предполагает, что у вас есть какая-то уникальность (Символ, Дата) в обеих таблицах.

Еще один комментарий заключается в том, что включение дат проблематично, особенно с учетом компонента времени. Я бы посоветовал вам CAST или CONVERT всех ваших значений даты в нечто, исключающее часть времени. Я бы использовал CONVERT (varchar (11), EOD.Date, 106), чтобы преобразовать дату во что-то без компонента даты. Смотрите ниже:

UPDATE      EOD
SET         EOD.Value = REALTIME.Value
FROM        EOD
INNER JOIN  REALTIME
ON          EOD.Symbol = REALTIME.Symbol
AND         CONVERT(varchar(11), EOD.Date, 106) = CONVERT(varchar(11), REALTIME.Date, 106)

INSERT INTO EOD ( Symbol , Date , Value )
SELECT        REALTIME.Symbol
            , CONVERT(varchar(11), REALTIME.Date, 106)
            , REALTIME.Value
FROM        EOD
LEFT JOIN   REALTIME
ON          EOD.Symbol = REALTIME.Symbol
AND         CONVERT(varchar(11), EOD.Date, 106) = CONVERT(varchar(11), REALTIME.Date, 106)
WHERE       EOD.Symbol IS NULL
AND         EOD.Date IS NULL
0 голосов
/ 05 мая 2010

Вот код, который составляет полную таблицу EOD из таблицы Realtime (протестирована на MSSQL 2008, но должна работать и на 2005).

SELECT Symbol, Date, Value FROM
(
    SELECT *, ROW_NUMBER() OVER(
        PARTITION BY symbol, DATEPART(yy, date), DATEPART(y, date) 
        ORDER BY date desc) AS ord
    FROM Realtime
) AS t
WHERE ord = 1

В зависимости от точных требований, вы можете настроить его так, чтобы он работал постепенно.

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