2009-04-21 12 views
0

Hypothetisches Beispiel:Wie kann ich am besten Übergänge in einer Transaktionstabelle extrahieren?

Ich habe eine SQL-Tabelle, die eine Milliarde oder so Transaktionen enthält:

 
| Cost | DateTime | 
| 1.00 | 2009-01-02 | 
| 2.00 | 2009-01-03 | 
| 2.00 | 2009-01-04 | 
| 3.00 | 2009-01-05 | 
| 1.00 | 2009-01-06 | 
... 

Was ich will, unten die Daten zu paaren ist, so dass ich die Kosten nur sehen Übergänge:

 
| Cost | DateTime | 
| 1.00 | 2009-01-02 | 
| 2.00 | 2009-01-03 | 
| 3.00 | 2009-01-05 | 
| 1.00 | 2009-01-06 | 
... 

Die einfachste (und langsamste) Möglichkeit besteht darin, über die gesamte Tabelle zu iterieren und die Änderungen zu verfolgen. Gibt es eine schnellere/bessere Möglichkeit, dies in SQL zu tun?

+0

Übergänge von was? –

+0

Ich bin mir nicht ganz sicher, ob ich das Problem vollständig verstehe. Können Sie bitte genauer sein? – Mostlyharmless

+0

Ich denke, er fragt nach den Punkten, an denen sich die Kosten ändern. Beachten Sie, dass er die zweite sequenzielle 2.00 Zeile übersprungen hat. –

Antwort

0

Nein. Es gibt keinen schnelleren Weg. Sie könnten eine Abfrage schreiben, die den gleichen Job erledigt, aber es wird viel langsamer sein. Sie (als Entwickler) wissen, dass Sie einen Wert nur mit seinem direkten vorherigen Wert vergleichen müssen, und es gibt keine Möglichkeit, dies mit SQL anzugeben. So können Sie Optimierungen vornehmen, die SQL nicht kann. So stelle ich mir vor, dass es am schnellsten ist, ein Programm zu schreiben, das die Ergebnisse von der Platte streamt und im RAM nur den letzten gültigen Wert und den aktuellen hält (jeden Wert herausfilternd, der gleich dem letzten ist).

0

Dies ist ein klassisches Beispiel für den Versuch, einen Vorschlaghammer zu verwenden, wenn ein Hammer benötigt wird. Sie möchten einige verrückte Berichtsdaten aus einer Tabelle extrahieren, aber dafür Ihren SQL Server TÖTEN. Um Änderungen nachzuverfolgen, müssen Sie eine Nachverfolgungstabelle speziell für diesen Zweck erstellen. Verwenden Sie dann einen Trigger, der eine Wertänderung in einem Produkt in dieser Tabelle aufzeichnet. Also, wenn ich den Preis ändere, geht es in meine Produkttabelle in die Preisverfolgungstabelle.

Wenn Sie dies verwenden, um Aktienkurse oder etwas Ähnliches zu verfolgen, dann verwenden Sie den gleichen Ansatz, außer dass Sie einen Vergleich der Preistabelle machen und wenn eine Änderung auftritt, speichern Sie sie. Der Vergleich findet also nur mit neuen Daten statt. Alle alten Vergleiche sind immer noch an einem Ort untergebracht, so dass Sie die Abfrage nicht erneut ausführen müssen, was die Leistung Ihres SQL Servers zunichte machen würde.

+1

Tatsächlich schreibe ich Migrationscode, um ein System in eine neue Architektur (und ein neues Schema) zu portieren. Das ursprüngliche Design hat solche Änderungen nicht verfolgt, also spiele ich Catch-Up. Danke für die Tipps! –

Verwandte Themen