如何添加/更新具有递增值的列并根据 SQL 中的另一列重置所述值

met*_*lfe 2 sql-server t-sql alter-table update temporary-tables

我很难过,我一直在搜索和研究,直到我的浏览器标签不再显示关闭按钮(“X”),直到您将鼠标悬停在它们上面。我一遍又一遍地尝试重写搜索词,但我想我不知道该问什么,所以如果已经回答了这个问题,我深表歉意。

我试图弄清楚如何将一个 INT 列添加到一个表中,该列从 1 开始并根据另一个列值(我们称之为case_id)递增(我们称此字段版本),如果该值与先前迭代的行 - 如果它不相同,则版本值应重置为 1。

我试图通过更新我创建的临时表或在 SELECT INTO 语句期间添加值来解决这个问题。

此表的目的是存储案例的历史更新记录,由case_id列标识,此版本值与修改时间戳的顺序相同。

将此表结构视为源数据的示例:

---------------------------------
| case_id | modify_time         |
---------------------------------
| 1       | 2015-05-01 11:12:13 |
| 1       | 2015-05-02 12:13:14 |
| 1       | 2015-05-03 13:14:15 |
| 2       | 2015-05-01 11:12:13 |
| 2       | 2015-05-01 12:13:14 |
| 3       | 2015-05-02 11:12:13 |
---------------------------------
Run Code Online (Sandbox Code Playgroud)

将此作为我想要实现的最终结果的示例:

-------------------------------------------
| case_id | modify_time         | version |
-------------------------------------------
| 1       | 2015-05-01 11:12:13 | 1       |
| 1       | 2015-05-02 12:13:14 | 2       |
| 1       | 2015-05-03 13:14:15 | 3       |
| 2       | 2015-05-01 11:12:13 | 1       |
| 2       | 2015-05-01 12:13:14 | 2       |
| 3       | 2015-05-02 11:12:13 | 1       |
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要添加version (INT) 列并根据modify_time(升序)插入一个递增的值,当case_id值更改时,该值将重置。

我尝试了一些我在搜索过程中偶然发现的东西,但我遇到的任何事情都无法帮助我解决这个问题。

我想这对我来说有点太高级了.. :-( 这是在 SQL Server 2012 上,无论多么先进,我都不怕尝试任何东西,因为我只能从这个练习中学习。

感谢您抽出时间查看我的问题,如果您能在这里帮助我,请提前感谢您。干杯。

Aar*_*and 5

您可以轻松维护此列:

;WITH x AS 
(
  SELECT case_id, modify_time, version, 
    rn = ROW_NUMBER() OVER (PARTITION BY case_id ORDER BY modify_date)
  FROM dbo.source_table
)
UPDATE x SET version = rn WHERE version <> rn;
Run Code Online (Sandbox Code Playgroud)

但是由于您也可以在每次需要查询时动态生成该版本列(也许它可能在视图中),所以我认为存储输出甚至在表中包含版本列没有任何好处,因为您可能会比阅读它更频繁地更新它(每次更改或添加任何行时,您都必须更新整个范围甚至整个表)。

如果您要将数据从一个系统移动到另一个系统,或者将一个表移动到另一个系统,您仍然不需要源表中存在此列,并且您也不需要临时表来存储此列

INSERT dbo.target_table(case_id, modify_time, version)
SELECT case_id, modify_time, version = ROW_NUMBER() OVER
  (PARTITION BY case_id ORDER BY modify_date)
FROM dbo.source_table;
Run Code Online (Sandbox Code Playgroud)