Próbuję opracować małe narzędzie do raportowania (z zapleczem sqlite). Mogę najlepiej opisać to narzędzie jako księgę „transakcji”. Staram się śledzić „transakcje” z cotygodniowego wyciągu danych:
- „nowy” (lub dodaj) - zasób jest nowy w mojej aplikacji, ponieważ moja aplikacja mogła wcześniej nie śledzić tego zasobu, ponieważ nie był widziany za pomocą wyciągów.
- „aktualizacja” (lub trafienie) - ostatnio korzystano z tego zasobu, aktualizowano okres przechowywania o kolejny tydzień.
- „usuń” (lub upuść) - ten element nie przydał się od ostatniego raportu (opcjonalnie, ale byłoby miło mieć na wykresie zmiany zapotrzebowania na zasoby z tygodnia na tydzień).
Wszystko, co mam, to cotygodniowy ekstrakt danych (plik płaski rozdzielany potokami) pochodzący ze starszego systemu archiwizacji / zarządzania rekordami, nad którym nie mam kontroli.
Każda linia może być destylowana w celu:
resource_id | resource info | customer_id | customer_info
Przykładowe dane:
10| Title X | 1 | Bob
11| Another title | 1 | Bob
10| Title X | 2 | Alice
Celem jest ułatwienie raportowania zasobów, które nie były używane przez X miesięcy (na podstawie ostatniego trafienia). Istnieje okres przechowywania, w którym zasoby są przechowywane dla łatwego dostępu, jeśli są popularne. Zasób, który nie był używany przez 18 miesięcy, jest przeznaczony do długoterminowej archiwizacji w innym miejscu.
To musi być powszechny problem. Zastanawiasz się, czy istnieje algorytm ogólnego przeznaczenia do określania, co nowego / tego samego / usunięto między zestawami danych (db vs. najnowszy wyciąg)?
Jeśli i tak przechowujesz aktualizacje w zapleczu SQLite, możesz zamienić cotygodniową aktualizację w nową tabelę i porównać ją z danymi zarchiwizowanymi z zapytaniami przed scaleniem.
Przykład użycia SQL do znajdowania nowych dodatków do tabeli: /programming/2077807/sql-query-to-return-differences-between-two-tables
Jeśli pole w bazie danych DB zawiera datę transakcji, możesz po prostu zapytać wszystkich użytkowników, którzy mieli transakcje w ciągu ostatnich 18 miesięcy. Zatem archiwum jest po prostu pełną bazą danych. Alternatywnie możesz wysłać zapytanie do wszystkich użytkowników, którzy tego nie zrobili, wyodrębnić ich dane, a następnie upuścić. W tym tygodniu aktualizacje są oznaczone dowolnymi wierszami.
źródło
Vector
.Alternatywny pomysł:
Przeanalizuj listę transakcji w jakąś strukturę danych, na przykład tablicę. (W C ++, pomyśl
Vector
i w JavieArrayList
.)Wykonaj zapytanie SQL backend na takie jak
SELECT DISTINCT customer_id FROM Transactions ORDER BY customer_id
i zapakować klasyfikowane odrębne identyfikatory klientów w zestawieold
. Jeśli zrobisz dokładnie to samo zWHERE
klauzulą oddzielającą stare i nowe transakcje, możesz pominąć krok 3.Uzyskaj unikalne identyfikatory klientów z nowych aktualizacji w osobnej strukturze danych, w posortowanej kolejności. Istnieje kilka struktur danych można użyć, aby dostać się do struktury danych
new
. Wstawianie sortowania do podwójnie połączonej listy jest bardzo proste, ale użycie pośredniej tablicy haszującej działałoby w czasie zbliżonym do liniowego, lub jeśli i tak sortujesz oryginalną tablicę, uzyskanie zestawu jest łatwe.Weź różnicę
new
-old
korzystając ze standardowej biblioteki swojego ulubionego języka. Twój ulubiony język ma ten algorytm w swojej standardowej bibliotece?Inne rzeczy, które chcesz zrobić, to na pewno zapytania SQL po zaktualizowaniu bazy danych transakcji.
Uwaga do kroku 3: Rozważ naturę swoich danych. Załóżmy, że Twój plik tekstowy wyświetla zamówienia chronologicznie, aw typowym tygodniu jest wielu klientów, którzy po raz pierwszy otrzymali nowe
customer_id
w kolejności rosnącej. Załóżmy, że większość innych zamówień pochodzi od niewielkiej liczby lojalnych stałych klientów, z niższymicustomer_id
. Twoje dane wejściowe są już w większości posortowane. Rodzaj wstawiania, w którym próbujesz wstawiać niskocustomer_id
na początku podwójnie połączonej listy i wysokocustomer_id
na tyle, w tej sytuacji sprawdziłby się w praktyce.źródło
Jak rozumiem z twojego pytania, faktycznie masz identyfikator_zasobu (+ informacje) i „listę” klienta (identyfikator + informacje).
Dzięki temu możesz łatwo przechowywać listę klientów według zasobów i sprawdzać ostatni węzeł na każdej liście w zasobie (aby poznać czas ostatniej operacji; wystarczy dodać pole daty do klienta w kodzie)
Nie znam SQL, dlatego podaję przykład
HashMap
i List, ale jestem pewien, że to ten sam pomysł:HashMap <Resource, List<Customer>>
kiedyResource
powinien zawieraćCustomer
identyfikator zasobu jako klucz i powinien zawierać identyfikator klienta, informacje i datę operacji.Dzięki temu pomysłowi możesz łatwo poznać czas ostatniej operacji i modyfikować dowolny zasób (dodaj \ usuń zasób \ klienta).
źródło
Jeśli korzystasz z bazy danych SqLite, jeśli dodasz datę partii również jako kolumnę tabeli,
dość łatwo byłoby użyć SQL, aby uzyskać zasoby nieużywane w ciągu ostatnich X dni
Nie przetestowałem SQL, ale powinien dać ci pomysł
źródło
Z oryginalnego postu wygląda na to, że przetwarzane dane nie mają pola wskazującego datę / godzinę transakcji, i zakładam, że plik jest przyjmowany często zgodnie z harmonogramem, takim jak dzienny, godzinowy itp.
Poradziłbym sobie z tym, dodając kolumnę znacznika czasu SQL, która jest albo automatycznie generowana na poziomie bazy danych, albo przez kod, który wyodrębnia dane i wstawia do bazy danych. Następnie umieść indeks w tej kolumnie znacznika czasu i gotowe. Pozwól silnikowi DB wykonać zadanie polegające na tym, aby skutecznie odpowiedzieć na pytanie „ile transakcji się nie wydarzyło od tego czasu” lub „ile transakcji od tego czasu do tego czasu”.
Następnie zaplanujesz zadanie, aby wykonać zapytanie i obliczyć różnice, które chcesz zgłosić. Transakcje, które są „nowe”, to transakcje, które nie mają żadnych rekordów w bazie danych przed datą zapytania o „nową od”. Stare rekordy to te, które nie zawierają transakcji od daty granicznej.
źródło
Czy nie po to są HashTables? Jeśli wszystko, co chcesz zrobić, to prowadzić ewidencję zasobów używanych w ostatnich miesiącach i usuwać zasoby, do których nie uzyskano dostępu w ciągu ostatnich 18 miesięcy, możesz użyć tabeli HashTable, w której kluczem jest id_zasobu, a wartością jest data ostatniego dostępu.
Aby zarchiwizować rekordy> 18 miesięcy, możesz przejrzeć wszystkie rekordy w tabeli skrótów i po prostu usunąć (lub przenieść) te konkretne rekordy. (możesz to robić co tydzień, gdy pojawi się raport)
źródło