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

好的。

请提供您的示例数据和表格式的预期输出