Newsgroup: it.comp.appl.access
Titolo: query per cancellare record uno ogni 2

SALVE
 
ho una tabella con migliaia di record.
codice, tipo, valore, data_ora
 
a ogni ora 2 record per ogni tipo.
come posso creare una query che mi cancelli un record ogni 2?
 
1, valvola, 123, 22/03/2016 10:00:01
2, valvola, 123, 22/03/2016 10:00:03
300, valvola, 223, 22/03/2016 11:00:01
301, valvola, 223, 22/03/2016 11:00:03
1000, valvola, 323, 22/03/2016 12:00:01
1001, valvola, 323, 22/03/2016 12:00:03
 
vorrei cancellare 
uno ogni 2
 
GRazie anticipatamente


delete where (id mod 2)=0  ? (o 1 fa lo stesso)
Ovviamente se hai codici accoppiati come hai descritto
-- 
ac (x=y-1)
Aborro il Killfile
(La violenza e' l'ultimo rifugio degli incapaci -Salvor Hardin-)
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 


Nell'esempio che fai c'è qualche cosa che non torna... ed il suggerimento di AC potrebbe non andare... dal momento in cui i primi 2 Records il secondo ha indice pari negli altri casi INdice Dispari...
Quindi se hai sbagliato l'esempio AC ti ha dato un buon suggerimenti...altrimenti... devi trovare l'elemento che tu usi per definire quale dei 2 Records è il 2°...
 
Forse converrebbe vedere la Data/Ora... e vedo che quelli da cancellare Forse hanno il Minuto=3...?
 
Valuta tu.
 
@Alex


Uhmmm   l'importante e' che la coppia sia contigua uno e' pari l'altro 
dispari o vaisvirsa.


 
 
Quello che dici lo puoi spiegare ad una Query pensando che capisca...?
Ti ho detto che devi trovare un CRITERIO... che siano contigui non serve a molto se l'INdice è RANDOM una volta pari una dispari... significa solo che quello non puoi usarlo.
 
Il tempo immagino sia altrettanto aleatorio...?
 
Aggiungi un campo Counter ed esegui la Query DELETE come ti ha detto AC sui valori PARI.
 
@Alex


A me AC non ha detto niente ;-)


 ac (x=y-1)
 
 
Perdo i colpi... torno all'oblio...
@Alex

Il giorno mercoledì 23 marzo 2016 17:36:05 UTC+1, pfm ha scritto:

Cancellarli secondo quale criterio ? 
Capisci che "uno ogni due" non basta.
 
 

 Ovviamente se hai codici accoppiati come hai descritto
 
Si ma come fai a sapere che ... ehm. Non so spiegarlo :-) 
Ossia che l' esempio che fa valga per tutta la tabella ? 
Lui ne vuole cancellare uno per ogni  "tipo",  ma  come 
sappiamo che ogni tipo abbia sempre due ID consecutivi ? 
 
Ah  propo' : col  catalogo ce so rimasto male. Ma sei sicuro
sicuro che Access non tiene traccia delle modifiche/canc/ins
di record nelle tabelle utente ? 
 
Sigh
 
 


 
Se non mi ricordo male da qualche parte sta cosa mi sembra di averla 
vista quando ho sviluppato l'applicativo di /monitoring/ di un db
(dovrebbe stare ancora su accessgroup ma e' per il 2003).
Ma se c'e' non mi ricordo assolutamente come ripescarla)
Non mi sembra che queste informazioni siano sulla sysobjects



Ah certo, si. Era proprio l' ipotesi che facevi. 

Il giorno mercoledì 23 marzo 2016 18:38:30 UTC+1, Alessandro Cara ha scritto:

grazie del messaggio
 
purtroppo analizzando le casistiche dei dati che arrivano dal PLC non sempre sono progressivi
 
pensavo di fare una query di raggruppamento per vedere quali sono doppi
come fare a cancellarli con una query?
 
GRAZIE

 doppi; come fare a cancellarli con una query?
 
"doppi" in che senso *esattamente* ? Spiegati  bene se vuoi essere 
aiutato. Qual' è  il  criterio esatto  che  definisce *doppia* una 
rilevazione ?  
 
 


ogni ora il PLC scrive un record per ogni valore per tipo
 
mi sono accorto che per un tipo invece viene scritto un record e dopo circa 800 millesimi di sec viene scritto un secondo record 
 
purtroppo non sempre sono consecutivi.
 
 
 
 


 
Non so cosa tu stia facendo ma ho la vaga impressione di conoscere 
l'argomento.
Quando arrivano i dati dal /campo/ non c'e' verso di averli sempre 
/belli e ordinati/.
Nel tuo caso si tratta di apertura/chiusura di valvole di condotta o 
sbaglio?
 
Perdonami la domanda.
Ma questa attivita' eliminazione dei duplicati e' una tantum  o
/una spessum/ ?
E hai piu' record, nel tempo,  riguardanti lo stesso id (valvola)?
 
 
Ti faccio le domande perche', a suo tempo, ho fatto una applicazione
per un impianto di raffinazione petrolio e mi arrivavano vagonate di
dati ogni minuto e cio' ha richiesto un /attento/ studio delle 
performances  e della fruibilita' dei dati
(che mi ha portato a /scartare/ l'ipotesi della /delete/ )
 
A occhio direi che un  indice univoco per id+data+ora e /fregandotene/
  dei duplicati ti dovrebbe evitare il problema della delete.
 
Altrimenti guarda il suggerimento di @Alex


 purtroppo non sempre sono consecutivi.
 
Azz ... Capito
 
imho : so cavoli amari, xkè con una "querucola" non se ne 
esce, qua devi /programmare/  e  scrivere  una  funzione; 
anzi : due
 
Devi : 
creare  una tabella nuova avente la stessa struttura di 
quella dove va a scrivere il PLC 
 
e usare (in tutta l' applicazione) questa nuova tabella 
e non piu' la vecchia
 
(certo,   se   riesci   a   forzare  il   PLC a scrivere in una 
altra tabella sarebbe meglio : in quel caso la tua applicazione
rimarrebbe del tutto indisturbata) 
 
Alchè : 
 
prendi la tabella vecchia e la schiaffi in un bel recordset
ordinato per tipo, tempo e valore; lo chiamo TV 
 
stabilisci un valore scarto temporale (vedi dopo)   
 
poi ti fai un ciclo su tutto il recordset, questo dovrebbe 
funzionare ma ... 
 
Sub Carica_Solo_Dati_Buoni (...) 
 
' dichiarazioni e bla bla (vedi sopra) 
 
if not (TV.eof and TV.bof) then TV.movefirst
 
do while not TV.eof()
 
   tempo_vecchio = TV.fields.value("codice")   
   valore_vecchio = TV.fields.value("valore")       
   tipo_vecchio   = TV.fields.value("tipo")  
 
riskippa:
 
   TV.movenext 
 
   if TV.eof() then exit loop   
 
   if not (valore_vecchio =  _
           TV.fields.value("valore"))   then goto riskippa
 
   if not (tipo_vecchio =  _
           TV.fields.value("tipo"))     then goto riskippa
 
   ' questa x ultima perchè è la piu lenta, quindi meno 
   ' volte ci arriva e meglio è : 
 
   if not scarto_tempo(tempo_vecchio,  _
                       TV.fields.value) then goto riskippa
 
   ' se  sei arrivato fin  qui il record è di sicuro buono, 
   ' dunque inserisci il record nella tabella nuova con una 
   ' query insert,  ad esempio. 
 
loop
' qua fai le operazioni di chiusura ecc ecc  
 
end sub 
 
' questa è la funzione che analizza lo scarto temporale : 
 
function scarto_tempo(inizio as string, fine as string) as boolean
      ' qua ti analizzi con calma il tempo passato tra le due
      ' rilevazioni. 
      ' se è "abbastanza breve" (ossia inferiore all' ora, a quanto
      ' ho capito) fai tornare true. 
 
      ' altrimenti false, e attento ai cambi data mi raccomando
 
end function 
 
'la tabella nuova sarà pulita e profumata come un neonato che ha
'fatto appena il bagnetto, salvo errori ed omissioni :-)