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 上,无论多么先进,我都不怕尝试任何东西,因为我只能从这个练习中学习。
感谢您抽出时间查看我的问题,如果您能在这里帮助我,请提前感谢您。干杯。
您可以轻松维护此列:
;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)
归档时间: |
|
查看次数: |
21809 次 |
最近记录: |