Algoritmo per la determinazione delle transazioni tra serie di dati settimanali?

9

Sto cercando di sviluppare un piccolo strumento di reporting (con backlite sqlite). Posso descrivere al meglio questo strumento come un libro mastro "transazione". Quello che sto cercando di fare è tenere traccia delle "transazioni" dall'estrazione di dati settimanali:

  • "nuovo" (o aggiungi) - la risorsa è nuova per la mia app poiché la mia app potrebbe non avere già tracciato questa risorsa in quanto non è stata vista tramite estratti.
  • "aggiornamento" (o hit) - c'è un uso recente di tale risorsa, il periodo di conservazione degli aggiornamenti di un'altra settimana.
  • "cancella" (o rilascia) - questo articolo non ha visto l'uso dall'ultima segnalazione (facoltativo, ma sarebbe bello avere per il grafico le modifiche da settimana a settimana della richiesta di risorse).

Tutto quello che ho è un estratto di dati settimanale (file flat delimitato da pipe) proveniente da un sistema di archiviazione / gestione dei record legacy di cui non ho il controllo.

Ogni linea può essere distillata in base a questo:
resource_id | resource info | customer_id | customer_info

Dati campione:

10| Title X       | 1 | Bob
11| Another title | 1 | Bob
10| Title X       | 2 | Alice

L'obiettivo è rendere semplice la segnalazione di risorse che non sono state utilizzate per X-mesi (in base all'ultimo hit). C'è un periodo di conservazione in cui le risorse vengono mantenute per facilità di accesso, se sono popolari. Una risorsa che non ha visto l'uso per 18 mesi è contrassegnata per l'archiviazione a lungo termine altrove.

Questo deve essere un problema comune. Ti chiedi se esiste un algoritmo per scopi generici per determinare cosa c'è di nuovo / uguale / rimosso tra i set di dati (db vs. ultimo estratto)?

    
posta Swartz 26.08.2015 - 01:00
fonte

7 risposte

1

Bene, la tua risposta è ... Sì. C'è un semplice algoritmo che puoi implementare che non richiede nessuna di quelle altre cose. È un algoritmo di valore attuale netto. È facile da implementare e tutto ciò che richiede sul lato DB è la data di stampare i dati settimanali e scrivere una semplice query e una piccola funzione ricorsiva o per il ciclo, oppure si potrebbe fare una di quelle altre soluzioni.

NPV = PV- (PV (CP / T) o il nuovo valore attuale è uguale al valore attuale moltiplicato per il periodo corrente (mesi dall'ultimo inserimento) diviso per il termine (ad esempio 18 mesi) quando il valore della risorsa scende a 0 è il valore attuale netto è esaurito.

Se mi dai una lang tu la vuoi qui inserirò il codice qui in una modifica

    
risposta data 05.09.2015 - 07:30
fonte
0

Se stai mantenendo gli aggiornamenti in un back-end SQLite in ogni caso, puoi trasformare l'aggiornamento settimanale in una nuova tabella e confrontarlo con i dati archiviati con le query, prima di unirle.

Esempio di utilizzo di SQL per trovare nuove aggiunte a una tabella: link

Se un campo nel tuo DB memorizza la data della transazione, puoi semplicemente interrogare tutti gli utenti che hanno avuto transazioni negli ultimi 18 mesi. Quindi l'archivio è solo il DB completo. In alternativa, puoi interrogare tutti gli utenti che non hanno, estrarre i loro dati, quindi rilasciarli. Gli aggiornamenti sono solo alcune righe con data e ora questa settimana.

    
risposta data 02.09.2015 - 00:58
fonte
0

Idea alternativa:

  1. Analizza l'elenco delle transazioni in una sorta di struttura dati, ad esempio un array. (In C ++, pensa Vector , e in Java, ArrayList .)

  2. Esegui una query sul back-end SQL come SELECT DISTINCT customer_id FROM Transactions ORDER BY customer_id e impacchetta gli ID cliente distinti ordinati in un set, old . Se fai esattamente la stessa cosa con una clausola WHERE che separa le transazioni vecchie e nuove, puoi saltare il passaggio 3.

  3. Ottieni gli ID cliente univoci dai nuovi aggiornamenti in una struttura dati separata, in ordine. Esistono un paio di strutture dati che è possibile utilizzare per ottenere una struttura dati, new . L'ordinamento di inserzione in una lista a doppio collegamento è molto semplice, ma l'utilizzo di un hash intermedio verrebbe eseguito in un tempo quasi lineare, o se si ordina comunque l'array originale, ottenere un set di dati è facile.

  4. Prendi la differenza impostata new - old usando la libreria standard della tua lingua preferita. La tua lingua preferita ha questo algoritmo nella sua libreria standard?

Le altre cose che vuoi fare sono sicuramente query SQL dopo aver aggiornato il tuo database delle transazioni.

Nota sul passaggio 3: considera la natura dei tuoi dati. Supponiamo che il tuo file di testo elenchi gli ordini in ordine cronologico, e in una settimana tipica, ci sono molti clienti che per la prima volta ricevono un nuovo customer_id in ordine crescente. Supponiamo che la maggior parte degli altri ordini provenga da un numero limitato di clienti fedeli, con una percentuale inferiore dicustomer_id. Quindi i tuoi input sono già per lo più ordinati. Un ordinamento per inserimenti in cui si prova ad inserire customer_id basso nella parte anteriore di un elenco con doppio collegamento e in alto customer_id sul retro, in tal caso, si comportano bene nella pratica.

    
risposta data 05.09.2015 - 11:26
fonte
0

Come ho capito dalla tua domanda hai effettivamente resource_id (+ info) e "list" del cliente (id + info).

Quindi puoi facilmente tenere un elenco di clienti per risorsa e controllare l'ultimo nodo in ogni elenco sulla risorsa (per conoscere l'ultima operazione, devi solo aggiungere il campo data al tuo cliente nel codice)

Non ho familiarità con SQL, quindi do il mio esempio con HashMap e List ma sono sicuro che sia la stessa idea: HashMap <Resource, List<Customer>> , quando Resource dovrebbe contenere resourceID come chiave e Customer dovrebbe contenere ID cliente, informazioni e data dell'operazione.

Con questa idea puoi conoscere facilmente l'ultima operazione e modificare qualsiasi risorsa (aggiungi \ rimuovi risorsa \ cliente).

    
risposta data 07.09.2015 - 09:38
fonte
0

Se si sta utilizzando un database SqLite, se si aggiunge la data del batch anche come colonna della tabella,

10| Title X       | 1 | Bob    | 2015-03-01
11| Another title | 1 | Bob    | 2015-03-01
...............................
10| Title X       | 1 | Alice  | 2015-03-05

sarebbe piuttosto facile usare un SQL per ottenere le risorse non utilizzate nell'ultimo numero di giorni X

Select distinct r.ResourceID from Resources r
where not exists (SELECT julianday('now') - julianday(r.DateUpdated)) < X

Non ho provato l'SQL ma dovrebbe darti un'idea

    
risposta data 07.09.2015 - 14:47
fonte
0

Dal post originale, sembra che i dati ingeriti non contengano un campo per indicare la data / ora della transazione e presumo che il file venga ingerito su base frequente su una pianificazione giornaliera, ogni ora, ecc.

Lo gestirò aggiungendo una colonna timestamp SQL che è autogenerata a livello di database o dal codice che estrae i dati e li inserisce nel DB. Quindi inserisci un indice su quella colonna timestamp e fallo con esso. Lascia che il motore DB svolga il compito di renderlo efficiente per rispondere alla domanda "quante transazioni non sono successe da questo momento" o "quante volte tra questa volta e quella volta".

Quindi si pianifica un lavoro per eseguire una query e calcolare i differenziali su cui si desidera eseguire il report. Le transazioni che sono "nuove" sono transazioni che non hanno alcun record nel DB prima della data in cui si chiede "nuovo dal". I vecchi record sono quelli che non hanno transazioni da una data limite.

    
risposta data 19.02.2017 - 18:57
fonte
-2

Non è questo ciò che sono per le tabelle di hash? Se tutto ciò che si vuole fare è conservare i record di quali risorse sono state utilizzate negli ultimi mesi ed eliminare le risorse a cui non si è avuto accesso negli ultimi 18 mesi, è possibile utilizzare una HashTable in cui la chiave è resource_id e il valore è il ultima data di accesso.

Per archiviare i record di > 18 mesi puoi esaminare tutti i record nella tabella hash e rimuovere (o spostare) quei record specifici. (puoi farlo settimanalmente quando arriva il rapporto)

    
risposta data 26.08.2015 - 12:23
fonte

Leggi altre domande sui tag