[table] 是我每分鐘決議一次的表,我正在使用“進行中”更新最舊的記錄。完成處理后,我洗掉“進行中”記錄并重新開始。我罕見的問題是,當我有相同的記錄嘗試在同一個 50 批次中匯入兩次時。我想改變這一點。
我有 [table] 的此更新
;WITH cte AS (
SELECT TOP 4 [Status]
FROM [table]
ORDER BY [ImportDate] ASC)
UPDATE cte SET [Status] = 'IN PROGRESS';
我想添加第二次更新(99% 的情況不會觸發,如果觸發,它肯定會最多 3 條記錄),其中任何IN PROGRESS基于名為 的列的 50 條記錄都是UniqueId重復的更新回New(最舊的記錄將保留該值IN PROGRESS,最新的將是NEW)
例子:
前
| 唯一身份 | 進口日期 | 地位 |
|---|---|---|
| 一種 | 2022-04-22 | 新的 |
| b | 2022-04-23 | 新的 |
| b | 2022-04-24 | 新的 |
| C | 2022-04-25 | 新的 |
| d | 2022-04-26 | 新的 |
| e | 2022-04-27 | 新的 |
后
| 唯一身份 | 進口日期 | 地位 |
|---|---|---|
| 一種 | 2022-04-22 | 進行中 |
| b | 2022-04-23 | 進行中 |
| b | 2022-04-24 | 進行中 |
| C | 2022-04-25 | 進行中 |
| d | 2022-04-26 | 新的 |
| e | 2022-04-27 | 新的 |
期望的第二次更新結果
| 唯一身份 | 進口日期 | 地位 |
|---|---|---|
| 一種 | 2022-04-22 | 進行中 |
| b | 2022-04-23 | 進行中 |
| b | 2022-04-24 | 新的 |
| C | 2022-04-25 | 進行中 |
| d | 2022-04-26 | 新的 |
| e | 2022-04-27 | 新的 |
注意唯一ID在原始資料庫中是唯一的,在我的表中不是唯一的,我的表沒有索引,沒有約束或任何東西,因為它幾乎一直是空的,除非我們將資料轉儲到其中
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
如果我理解正確,您可以嘗試使用Row_NUMBER視窗函式兩次而不是TOP,第一個Row_NUMBER視窗生成可以過濾的行數TOP
另一個Row_NUMBER視窗首先更新ImportDate每個UniqueId
;WITH cte AS (
SELECT *
FROM
(
SELECT [Status],
ROW_NUMBER() OVER(PARTITION BY UniqueId ORDER BY ImportDate) rn1,
ROW_NUMBER() OVER(ORDER BY ImportDate) rn2
FROM [table]
) t1
WHERE rn1 = 1 AND rn2 BETWEEN 1 AND 4
)
UPDATE cte
SET [Status] = 'IN PROGRESS'
sqlfiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466138.html
上一篇:T-SQL用分號分割字串欄位產生錯誤XML決議:第1行,字符49,非法名稱字符
下一篇:只有兩個物件 其余計數
