Ich habe eine Tabelle, die einige Daten speichert. Jede Datenzeile hat eine Sequenznummer, die nach Organisation und Jahr gruppiert ist. Die Struktur dieser Tabelle untenReassign eine Sequenznummer, wenn Spalte durch Trigger geändert wird
| ID | Seq_num | Organisation | Year |
|----|---------|--------------|------|
| 1 | 1 | A | 2017 |
| 2 | 2 | A | 2017 |
| 3 | 3 | A | 2017 |
| 4 | 1 | A | 2018 |
| 5 | 2 | A | 2018 |
| 6 | 3 | A | 2018 |
| 7 | 1 | A | 2019 |
| 8 | 2 | A | 2019 |
| 9 | 4 | A | 2017 |
Ich habe 2 Fällen für diese Tabelle:
1) mit einer Sequenznummer an die neue Zeile
2) zuweisen einer Sequenznummer neu zuzuweisen, wenn die Spalten Jahr geändert wird
Für den ersten Fall wähle ich nur max von seq_num über Organisation und Jahr wie folgt aus:
UPDATE table
SET Seq_num =isnull(CurrMaxNum+1,1)
FROM table t
LEFT JOIN (SELECT DISTINCT Year, Organisation,
MAX(Seq_num) OVER (PARTITION BY Year, Organisation) AS CurrMaxNum
FROM table
GROUP BY Year,Organisation, Seq_num) as num
on num.Organisation=t.Organisation and num.Year=t.Year
WHERE (t.Seq_num IS Null OR t.Seq_num = 0 )
and (t.Organisation=num.Organisation and num.Year=t.Year)
Für den zweiten Fall muss ich neu zuweisen Seq_num wenn Jahr geändert wird. Zum Beispiel, wenn ich das Jahr für id=5
von 2018 bis 2017 ändere, sollte Seq_num
von 2 zu 4 wechseln, da 4 gleich der maximalen Anzahl in 2017 Gruppe +1 ist.
Die anderen Werte müssen nicht neu zugewiesen werden. Wie soll ich bekommen, was ich brauche?
Guter Job mit der maximalen Windowing. Ich muss mir angewöhnen, das als Anwendungsfall vorzuschlagen, wie er seit 2012 verfügbar ist. –