Die Tabelle, an der ich arbeite, besteht aus drei Komponenten:
- Eine
ID
Spalte (Primärschlüssel in einer anderen Tabelle) - Einige Datenspalten
- Gültiges Datum
from
/to
Spalten.
Werte:
ID Data From To
1 a 2015-01-01 2015-01-05
1 a 2015-01-06 2015-01-10
1 b 2015-01-11 2015-01-15
1 a 2015-01-16 2015-01-20
2 c 2015-01-01 2015-01-05
2 c 2015-01-06 2015-01-10
Die Tabelle wird aktualisiert, indem in bestimmten Intervallen "Snapshots" einer anderen Datenquelle erstellt und Datensätzen Gültigkeitsdaten zugewiesen werden. Das Problem ist, dass diese Snapshots doppelte Einträge für Datensätze (mit unterschiedlichen Gültigkeitsdaten) erstellen, die in diesem Intervall überhaupt nicht geändert wurden.
Ich möchte die Größe der Tabelle reduzieren, indem ich nach Zeilen mit aufeinanderfolgenden Daten suche und sie zusammenführe und ihnen einen einzigen Gültigkeitszeitraum zuweise. Zum Beispiel:
ID Data From To
1 a 2015-01-01 2015-01-10
1 b 2015-01-11 2015-01-15
1 a 2015-01-16 2015-01-20
2 c 2015-01-01 2015-01-10
Die Logik, die ich derzeit habe, ist:
- Wählen Sie alle Zeilen aus und sortieren Sie sie nach ID, Datenfeldern und "Gültig von" -Feldern (also in Gruppen aufeinanderfolgender Zeilen).
- Verwenden Sie einen Cursor, um benachbarte Zeilen auf Ähnlichkeit zu vergleichen.
- Wenn sie identisch sind, führen Sie die Zeilen zusammen und ändern Sie die Gültigkeitsdauer so, dass beide Zeilen enthalten sind.
Ich verstehe, dass Cursor sehr ineffizient sind (ich habe einen großen Datensatz), daher suche ich nach anderen Ansätzen.
CREATE TABLE
Anweisung in die Frage ein.Antworten:
Wenn dies nur eine Tabelle mit aufeinanderfolgenden Bereichen ist, kann Ihr Fall als klassisches Problem mit "Lücken und Inseln" behandelt werden, bei dem Sie nur Inseln mit aufeinanderfolgenden Bereichen isolieren und sie dann "verdichten" müssen, indem Sie das Minimum
[from]
und "nehmen" das Maximum[to]
pro Insel.Es gibt eine etablierte Methode, um dies mit zwei ROW_NUMBER-Aufrufen zu lösen:
Diese Abfrage funktioniert in einer so niedrigen Version wie SQL Server 2005.
quelle
Ich konnte eine Abfrage schreiben, um dieses Problem zu beheben. Es werden mehrere Verknüpfungen und eine while-Schleife verwendet, um Datensätze zusammenzuführen. Dieser Code ist mit SQL Server 2008 R2 kompatibel.
quelle
Nur für den Fall, dass Sie nicht zusammenhängende Datumsbereiche haben, die, obwohl aufeinanderfolgend, getrennt bleiben müssen, habe ich folgende Lösung gefunden:
Siehe SQL Fiddle
quelle
Ich habe eine Abfrage geschrieben, die zu funktionieren scheint. Es verwendet allgemeine Tabellenausdrücke, MERGE-Anweisungen und Analysefunktionen. Es ist jedoch nur mit SQL Server 2012+ kompatibel. Das Wesentliche finden Sie hier: MergeRecordsByValidityDate.sql
quelle