MS SQL:仅更新每个组的最后一条记录

时间:2016-03-18 20:56:28

标签: sql sql-server sql-update

我在MS SQL Server中有一个表,它有一些唯一且重复的记录。

让我们说我的桌子就像

Name   Modified    Visibility   UserTypeEx
x      24.05.2015      1           4096
y      01.01.2014      0           4096
z      01.04.2016      1           4096
x      05.03.2015      1           4096
y      06.08.2015      1           4097
y      05.07.2014      1           4096

如您所见,我在name列中有重复。我要做的是将所有visibility字段更新为0 UserTypeEx所在的4096,除了我想要的重复name的地方仅更新共享name的每个组中最后添加的记录。

这样的更新会将示例数据转换为:

Name   Modified    Visibility   UserTypeEx
x      24.05.2015      0           4096
y      01.01.2014      0           4096
z      01.04.2016      0           4096
x      05.03.2015      1           4096
t      06.08.2015      1           4097
y      05.07.2014      0           4096

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

在SQL Server中,您可以使用带有更新的窗口函数。这非常方便:

with toupdate as (
      select t.*,
             row_number() over (partition by name order by modified desc) as seqnum,
             count(*) over (partition by name) as cnt
      from t
      where UserTypeEx
     )
update toupdate
    set visibility = 0
    where cnt > 1 and seqnum = 1;