SQL更新组中除一条记录外的所有记录
我有一张这样的桌子:SQL更新组中除一条记录外的所有记录,sql,sql-server,Sql,Sql Server,我有一张这样的桌子: |f_key1|f_key_2|bool_value|updated_at| 我想编写一个SQL查询,它获取bool_值为true的每个记录,并按f_key1和f_key2将bool_值设置为false进行分组。换句话说,在查询结束时,每对2个键应该只有一条记录,其中bool_值为true,其余的设置为false。保留为真的确切记录并不重要,但如果需要,可以对处的更新的记录进行排序,并选择最新的值 样本数据 |f_key1|f_key_2|bool_value|updat
|f_key1|f_key_2|bool_value|updated_at|
我想编写一个SQL查询,它获取bool_值为true的每个记录,并按f_key1和f_key2将bool_值设置为false进行分组。换句话说,在查询结束时,每对2个键应该只有一条记录,其中bool_值为true,其余的设置为false。保留为真的确切记录并不重要,但如果需要,可以对处的更新的记录进行排序,并选择最新的值
样本数据
|f_key1|f_key_2|bool_value|updated_at|
|1 |2 | true | date |
|1 |2 | true | date |
|4 |2 | true | date |
输出
|f_key1|f_key_2|bool_value|updated_at|
|1 |2 | true | date |
|1 |2 | false | date |
|4 |2 | true | date |
如何通过与Microsoft SQL Server兼容的方式实现这一点?使用可更新的CTE:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY f_key1, f_key_2 ORDER BY updated_at DESC) rn
FROM yourTable
WHERE bool_value = 1
)
UPDATE cte
SET bool_value = 0
WHERE rn > 1;
这种方法会将每组最近的记录的bool_值设置为true
update x1
set
bool_value = 1
from table x1
inner join
(
select f_key1, f_key2, max_updated_at = max(updated_at)
from table x2
group by
f_key1,
f_key2
) x2
on x1.f_key1 = x2._fkey1
x1.f_key2 = x2.f_key2
and x1.updated_at = x2.max_updated_at
好的。请提供您的示例数据和表格式的预期输出