Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie modelliere ich Daten, die sich im Laufe der Zeit langsam ändern?

Ich hatte ein ähnliches Problem - große flache Dateien, die einmal pro Tag in die Datenbank importiert wurden. Die meisten Daten ändern sich nicht.

Fügen Sie der Tabelle zwei zusätzliche Spalten hinzu, Starting_date und ending_date. Der Standardwert für ending_date sollte irgendwann in der Zukunft liegen.

Um eine Datei mit der nächsten zu vergleichen, sortieren Sie beide nach den Schlüsselspalten und lesen Sie dann eine Zeile aus jeder Datei.

  • Wenn die Schlüssel gleich sind:Vergleichen Sie die restlichen Spalten, um zu sehen, ob sich die Daten geändert haben. Wenn die Zeilendaten gleich sind, befindet sich die Zeile bereits in der Datenbank und es gibt nichts zu tun; Wenn es anders ist, aktualisieren Sie die vorhandene Zeile in der Datenbank mit einem Enddatum von heute und fügen Sie eine neue Zeile mit einem Startdatum von heute ein. Lies eine neue Zeile aus beiden Dateien.
  • Wenn der Schlüssel aus der alten Datei kleiner ist:Die Zeile wurde gelöscht. Enddatum auf heute aktualisieren. Liest eine neue Zeile aus der alten Datei.
  • Wenn der Schlüssel aus der neuen Datei kleiner ist:Es wurde eine Zeile eingefügt. Fügen Sie die Zeile mit dem Startdatum heute in die Datenbank ein. Liest eine neue Zeile aus der neuen Datei.

Wiederholen Sie diesen Vorgang, bis Sie alles aus beiden Dateien gelesen haben.

Um nun die Zeilen abzufragen, die zu einem beliebigen Datum gültig waren, wählen Sie einfach mit einer where-Klausel test_date zwischen start_date und end_date aus.