将行插入主键中具有多个字段的表中,其中最后一个应自动增量

时间:2010-02-05 04:20:21

标签: sql sql-server tsql

我将金融工具的价格数据事件存储在表格中。由于同一时间戳可能有多个事件,因此表的主键包含符号,时间戳和“顺序”字段。插入行时,如果没有其他行具有相同的时间戳和符号,则order字段应为零。否则它应该是相同时间戳和符号的最大顺序之一。

旧版本的数据库使用不同的架构。它为表中的每一行都有一个唯一的Guid,然后有符号和时间戳。因此,它不会在具有相同时间戳的多个刻度之间保留顺序。

我想编写一个T-SQL脚本来将数据从旧数据库复制到新数据库。我想做这样的事情:

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

但我不确定如何表达我想要的Order字段,或者甚至可以这样做。

执行此数据转换的最佳方法是什么?

我希望这可以在SQL Server 2005或2008上运行。

1 个答案:

答案 0 :(得分:3)

这看起来像...... 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表示每组SymbolTimestamp的行号都是唯一的。 ORDER BY指定生成序列的顺序。