Sql-Server

如何添加/更新具有遞增值的列並根據 SQL 中的另一列重置所述值

  • January 14, 2018

我很困惑,我已經搜尋和研究,直到我的瀏覽器選項卡不再顯示關閉按鈕(“X”),直到你將滑鼠懸停在它們上面。我嘗試一遍又一遍地重寫搜尋詞,但我想我不知道要問什麼,所以如果已經回答了這個問題,我深表歉意。

我試圖弄清楚如何將一個 INT 列添加到一個表中,該表從 1 開始並遞增 1(我們稱之為這個欄位version)基於另一個列值(我們將稱之為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 |
---------------------------------

將此視為我想要實現的最終結果的範例:

-------------------------------------------
| 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       |
-------------------------------------------

如您所見,我需要添加版本(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;

但是由於您也可以在每次需要查詢時動態生成該版本列(也許它可能在視圖中),所以我看不到儲存輸出甚至在表中具有版本列的任何好處,因為您可能會比閱讀它更頻繁地更新它(每次更改或添加任何行時,您都必須更新整個範圍甚至整個表)。

如果您要將數據從一個系統移動到另一個系統,或者將一個表移動到另一個系統,您仍然不需要此列存在於源表中,並且您也不需要臨時表來儲存此列

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;

引用自:https://dba.stackexchange.com/questions/114986