SQL 更新按特定日期排序的重复项

SQL Update duplicates ordered by specific date

[table] 是一个 table,我每分钟解析一次,我正在用 'in progress' 更新最旧的记录。当我完成处理后,我删除 'in progress' 记录并重新开始。我的 罕见 问题是当我有相同的记录试图在同一个 50 批次中导入两次时。我想改变这个。

我有 [table]

的更新
;WITH cte AS (
SELECT  TOP 4   [Status]
FROM            [table] 
ORDER BY        [ImportDate] ASC)
UPDATE cte SET [Status] = 'IN PROGRESS';

我想添加第二个更新(99% 的情况不会触发,当它触发时,它肯定会最多 3 条记录),其中任何 50 IN PROGRESS 条记录是基于名为 UniqueId 的列的欺骗,将更新回 New(最旧的记录将保留值 IN PROGRESS,最新的将是 NEW

示例:

之前

UniqueId ImportDate Status
a 2022-04-22 new
b 2022-04-23 new
b 2022-04-24 new
c 2022-04-25 new
d 2022-04-26 new
e 2022-04-27 new

之后

UniqueId ImportDate Status
a 2022-04-22 in progress
b 2022-04-23 in progress
b 2022-04-24 in progress
c 2022-04-25 in progress
d 2022-04-26 new
e 2022-04-27 new

想要第二次更新的结果

UniqueId ImportDate Status
a 2022-04-22 in progress
b 2022-04-23 in progress
b 2022-04-24 new
c 2022-04-25 in progress
d 2022-04-26 new
e 2022-04-27 new

注意unique id在原始数据库中是唯一的,在我的table中不是唯一的,我的table没有索引,没有约束或任何东西,因为它几乎一直是空的,除非我们将数据转储到其中

我该怎么做?

如果我理解正确你可以尝试使用Row_NUMBERwindow函数两次而不是TOP,第一个Row_NUMBERwindow生成行数可以过滤 TOP

另一个 Row_NUMBER window 先更新 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