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_NUMBER
window函数两次而不是TOP
,第一个Row_NUMBER
window生成行数可以过滤 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'
[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_NUMBER
window函数两次而不是TOP
,第一个Row_NUMBER
window生成行数可以过滤 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'