【问题标题】:SQL update records with incrementing value starting from 1 each timeSQL 更新记录,每次从 1 开始递增值
【发布时间】:2010-09-09 09:14:38
【问题描述】:

我正在使用单个插入语句将记录批量添加到表中。我希望为每个新批次分配递增的数字,但每次都从 1 开始。

所以,如果我有

Batch    Name    IncementingValue
1        Joe     1
1        Pete    2
1        Andy    3
2        Sue     1
2        Mike    2
2        Steve   3

然后我添加两条记录(使用单个插入语句):

3        Dave
3        Paul

如何对这个表运行更新语句,以便将 Dave 设置为 1,将 Paul 设置为 2。我不想使用游标。

【问题讨论】:

  • 您的目标是哪个 RDBMS?

标签: sql sql-update auto-increment


【解决方案1】:

排名功能ROW_NUMBER 应该可以满足您的需求。您没有提到有关如何分配序列号的任何具体规则,所以我在这里使用名称完成了它:

INSERT targetTable(Batch,Name,IncementingValue)
SELECT BatchId,
       Name,
       ROW_NUMBER() OVER (ORDER BY Name)
FROM sourceTable

【讨论】:

  • @Ed - 你知道我是否可以通过更新语句应用这些值,例如从 SegmentationKeysUnconstrained where batchid='58D73880-31B1-40AF-A749-7F6EBEAAF3E4' 更新 SegmentationKeysUnconstrained set batchrownumber=row_number() over (order by trackingtokenid)
  • 我遇到的问题是我需要在几个插入语句中分配一组 row_number() 值,所以我实际上不能在插入点使用 row_number - 我必须这样做一次几个插入已完成。
  • 以下方法成功了: UPDATE derivedtable SET batchrownumber = rowno FROM ( SELECT batchrownumber, ROW_NUMBER() OVER(PARTITION BY batchid ORDER BY trackingtokenid) AS rowno FROM SegmentationKeysUnconstrained where batchid='58D73880-31B1-40AF -A749-7F6EBEAAF3E4' ) AS 派生表
【解决方案2】:

我需要用日期和格式化数字完成类似的事情。

希望有人会发现这个示例很有用。

    update TEST_TABLE 
    set ref = reference
          from (
                      select 
                          *, 
                          (CONVERT(VARCHAR(10),GETDATE(),12) + RIGHT('0000' + CAST(ROW_NUMBER() OVER (ORDER BY id) AS VARCHAR(4)), 4)) as reference 
                      from TEST_TABLE
                      WHERE 
                    test_table.id > 4
                        and
                    test_table.id < 8 
                ) TEST_TABLE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多