Вставка строк в таблицу с несколькими полями в первичном ключе, последний из которых должен автоинкрементироваться - PullRequest
0 голосов
/ 05 февраля 2010

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

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

Я хочу написать сценарий T-SQL для копирования данных из старой базы данных в новую. Я хотел бы сделать что-то вроде этого:

INSERT INTO NewTable (Symbol, Timestamp, Order, OtherFields)
SELECT OldTable.Symbol, OldTable.TimeStamp, <???>, OldTable.OtherFields
FROM OldTable

Но я не уверен, как выразить то, что я хочу, для поля «Порядок», или если вообще возможно сделать это таким образом.

Каков наилучший способ выполнить это преобразование данных?

Я хочу, чтобы это работало на SQL Server 2005 или 2008.

1 Ответ

3 голосов
/ 05 февраля 2010

Это похоже на работу для ... ROW_NUMBER!

INSERT INTO NewTable (Symbol, Timestamp, Order, OtherFields)
SELECT
    ot.Symbol, ot.TimeStamp,
    ROW_NUMBER() OVER
    (
        PARTITION BY ot.Symbol, ot.Timestamp
        ORDER BY ot.SomeOtherField
    ) - 1 AS Order,
    ot.OtherFields
FROM OldTable ot

PARTITION BY означает, что номера строк уникальны для каждой группы Symbol и Timestamp. ORDER BY указывает, в каком порядке генерируется последовательность.

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