Sql-Server
如何添加/更新具有遞增值的列並根據 SQL 中的另一列重置所述值
我很困惑,我已經搜尋和研究,直到我的瀏覽器選項卡不再顯示關閉按鈕(“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;