Ich versuche, ein kleines Berichterstellungstool (mit SQLite-Backend) zu entwickeln. Ich kann dieses Tool am besten als "Transaktions" -Buch beschreiben. Ich versuche, "Transaktionen" aus dem wöchentlichen Datenextrakt zu verfolgen:
- "neu" (oder hinzufügen) - Die Ressource ist neu in meiner App, da meine App diese Ressource möglicherweise noch nicht verfolgt hat, da sie nicht über Auszüge angezeigt wurde .
- "Update" (oder Treffer) - Diese Ressource wurde kürzlich verwendet. Die Aufbewahrungsdauer wird um eine weitere Woche aktualisiert.
- "Löschen" (oder Löschen) - Dieses Element wurde seit dem letzten Bericht nicht mehr verwendet (optional, wäre aber hilfreich, um Änderungen des Ressourcenbedarfs von Woche zu Woche grafisch darzustellen).
Alles, was ich habe, ist ein wöchentlicher Datenextrakt (durch Pipe getrennte Flatfile), der aus einem alten Archivierungs- / Datensatzverwaltungssystem stammt, über das ich keine Kontrolle habe.
Jede Linie kann grundsätzlich folgendermaßen destilliert werden:
resource_id | resource info | customer_id | customer_info
Beispieldaten:
10| Title X | 1 | Bob
11| Another title | 1 | Bob
10| Title X | 2 | Alice
Ziel ist es, die Berichterstattung über Ressourcen zu vereinfachen, die seit X Monaten nicht mehr verwendet wurden (basierend auf dem letzten Treffer). Es gibt eine Aufbewahrungsfrist, in der Ressourcen für einen einfachen Zugriff aufbewahrt werden, wenn sie beliebt sind. Eine Ressource, die seit 18 Monaten nicht mehr verwendet wird, ist für die langfristige Archivierung an anderer Stelle gekennzeichnet.
Dies muss ein häufiges Problem sein. Sie fragen sich, ob es einen Allzweckalgorithmus gibt, mit dem ermittelt werden kann, was zwischen Datensätzen neu / gleich / entfernt ist (Datenbank vs. letzter Auszug)?
Wenn Sie die Aktualisierungen trotzdem in einem SQLite-Backend aufbewahren, können Sie die wöchentliche Aktualisierung in eine neue Tabelle umwandeln und sie mit Abfragen mit den archivierten Daten vergleichen, bevor Sie sie zusammenführen.
Beispiel für die Verwendung von SQL zum Suchen neuer Ergänzungen zu einer Tabelle: /programming/2077807/sql-query-to-return-differences-between-two-tables
Wenn in einem Feld in Ihrer Datenbank das Datum der Transaktion gespeichert ist, können Sie einfach alle Benutzer abfragen, die in den letzten 18 Monaten Transaktionen durchgeführt haben. Dann ist das Archiv nur die vollständige Datenbank. Alternativ können Sie alle Benutzer abfragen, die dies nicht getan haben, ihre Daten extrahieren und sie dann löschen. Updates sind nur beliebige Zeilen, die diese Woche mit einem Zeitstempel versehen wurden.
quelle
Vector
.Alternative Idee:
Analysieren Sie Ihre Liste von Transaktionen in eine Art Datenstruktur, z. B. ein Array. (Denken Sie in C ++
Vector
und in JavaArrayList
.)Führen Sie eine Abfrage in Ihrem SQL-Backend durch, z. B.
SELECT DISTINCT customer_id FROM Transactions ORDER BY customer_id
und packen Sie die sortierten unterschiedlichen Kunden-IDs in einen Satzold
. Wenn Sie genau dasselbe mit einerWHERE
Klausel tun, die die alten und neuen Transaktionen trennt, können Sie Schritt 3 überspringen.Holen Sie sich die eindeutigen Kunden-IDs aus den neuen Updates in sortierter Reihenfolge in eine separate Datenstruktur. Es gibt einige Datenstrukturen, mit denen Sie eine Datenstruktur erstellen können
new
. Das Einfügen einer Sortierung in eine doppelt verknüpfte Liste ist sehr einfach, aber die Verwendung einer Zwischen-Hashtabelle würde in nahezu linearer Zeit ausgeführt. Wenn Sie das ursprüngliche Array trotzdem sortieren, ist es einfach, daraus einen Satz zu erstellen.Nehmen Sie den eingestellten Unterschied
new
-old
verwenden Sie die Standardbibliothek Ihrer Lieblingssprache. Ihre Lieblingssprache hat diesen Algorithmus in ihrer Standardbibliothek?Die anderen Dinge, die Sie tun möchten, sind definitiv SQL-Abfragen, nachdem Sie Ihre Transaktionsdatenbank aktualisiert haben.
Hinweis zu Schritt 3: Berücksichtigen Sie die Art Ihrer Daten. Angenommen, Ihre Textdatei listet Bestellungen chronologisch auf, und in einer typischen Woche gibt es viele Erstkunden, die eine neue
customer_id
in aufsteigender Reihenfolge erhalten. Angenommen, die meisten anderen Bestellungen stammen von einer kleinen Anzahl treuer Stammkunden mit wenigercustomer_id
. Dann sind Ihre Eingaben bereits größtenteils sortiert. Eine Einfügungssortierung, bei der Sie versuchen, am Anfangcustomer_id
einer doppelt verknüpften Liste niedrig undcustomer_id
hinten hoch einzufügen, würde in dieser Situation in der Praxis gut funktionieren.quelle
Wie ich aus Ihrer Frage verstehe, haben Sie tatsächlich resource_id (+ info) und "Liste" des Kunden (id + info).
So können Sie auf einfache Weise die Kundenliste pro Ressource führen und den letzten Knoten in jeder Liste der Ressource überprüfen (um die letzte Betriebszeit zu ermitteln; Sie müssen Ihrem Kunden nur ein Datumsfeld im Code hinzufügen).
Ich bin nicht mit SQL vertraut, daher gebe ich mein Beispiel mit
HashMap
und List an, aber ich bin mir sicher, dass es dieselbe Idee ist:HashMap <Resource, List<Customer>>
WannResource
sollte die Ressourcen-Customer
ID als Schlüssel und die Kunden-ID, Informationen und das Betriebsdatum enthalten.Mit dieser Idee können Sie die letzte Betriebszeit leicht ermitteln und jede Ressource ändern (Ressource hinzufügen / entfernen \ Kunde).
quelle
Wenn Sie eine SqLite-Datenbank verwenden und das Datum des Stapels auch als Spalte der Tabelle hinzufügen,
Es wäre ziemlich einfach, eine SQL zu verwenden, um die Ressourcen zu erhalten, die in den letzten X Tagen nicht verwendet wurden
Ich habe SQL nicht getestet, aber es sollte Ihnen eine Idee geben
quelle
Aus dem ursprünglichen Beitrag geht hervor, dass die aufgenommenen Daten kein Feld zur Angabe des Datums / der Uhrzeit der Transaktion enthalten. Ich gehe davon aus, dass die Datei häufig nach einem Zeitplan wie täglich, stündlich usw. aufgenommen wird.
Ich würde dies behandeln, indem ich eine SQL-Zeitstempelspalte hinzufüge, die entweder auf Datenbankebene automatisch generiert wird, oder durch den Code, der die Daten extrahiert und in die Datenbank einfügt. Dann setzen Sie einen Index auf diese Zeitstempelspalte und fertig. Lassen Sie die DB-Engine die Frage effizient erledigen, wie viele Transaktionen seit diesem Zeitpunkt nicht mehr stattgefunden haben oder wie viele zwischen diesem Zeitpunkt und diesem Zeitpunkt.
Anschließend planen Sie einen Job zum Abfragen und Berechnen der Differentiale, über die Sie Bericht erstatten möchten. Transaktionen, die "neu" sind, sind Transaktionen, die vor dem Datum, an dem Sie "neu seit" fragen, keine Datensätze in der Datenbank haben. Alte Datensätze sind solche, die seit dem Stichtag keine Transaktionen mehr haben.
quelle
Ist das nicht was HashTables sind? Wenn Sie lediglich Aufzeichnungen darüber führen möchten, welche Ressourcen in den letzten Monaten verwendet wurden, und Ressourcen löschen, auf die in den letzten 18 Monaten nicht zugegriffen wurde, können Sie eine HashTable verwenden, bei der der Schlüssel die resource_id und der Wert der ist letztes Zugriffsdatum.
Um die Datensätze für mehr als 18 Monate zu archivieren, können Sie alle Datensätze in der Hash-Tabelle durchgehen und diese spezifischen Datensätze einfach entfernen (oder verschieben). (Sie können dies wöchentlich tun, wenn der Bericht eingeht.)
quelle