2016-03-18 16 views
1

Ich habe eine Tabelle in MS SQL Server, die einige eindeutige und doppelte Datensätze hat.MS SQL: Nur den letzten Datensatz jeder Gruppe aktualisieren

Sagen wir meinen Tisch

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 

wie

ist Wie Sie sehen können, ich Duplizierung in der name Spalte haben. Was ich versuche zu tun ist, alle visibility Felder zu 0 wo UserTypeEx ist 4096 zu aktualisieren, außer dass, wo es doppelte name s Ich möchte nur den zuletzt hinzugefügten Datensatz unter denen in jeder Gruppe zu teilen eine name teilen.

Eine solche Aktualisierung würde die Beispieldaten zu dieser Transformation:

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 

Irgendwelche Vorschläge?

Antwort

2

In SQL Server können Sie Fensterfunktionen mit Update verwenden. Dies ist sehr praktisch:

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; 
+0

Danke für die Antwort. Klappt wunderbar –

Verwandte Themen