代码之家  ›  专栏  ›  技术社区  ›  Daniel Plaisted

在主键中包含多个字段的表中插入行,最后一个字段应自动递增

  •  0
  • Daniel Plaisted  · 技术社区  · 15 年前

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

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

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

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

    但我不知道如何表达我想要的Order字段,或者是否有可能这样做。

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

    我希望它可以在SQLServer2005或2008上运行。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Aaronaught    15 年前

    这看起来像是一份。。。 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