Newsgroup: it.comp.lang.delphi
Titolo: Parsing tabella

Ciao a tutti,
  ho una tabella con circa 200.000 righe (record); uno dei campi e' data 
(ovvero la data in cui il record e' stato salvato).
Questi records hanno 20 date diverse (per esempio in data 2 maggio 2017 e' 
stato fatto un salvataggio dove sono stati registrati circa 8.000 records 
con questa data).
Esiste un modo diverso e piu' veloce dal leggere tutte le righe e salvare in 
una lista le diverse date?
Esiste un file indice sulla data, ma non so se e' possibile leggere l'indice 
e tirare fuori le 20 date.
 
Scusate la banalita' ..... ma non mi viene in mente niente ....
 
Grazie
 
Daniele 
 


Su che DB e' questa tabella? E' un DB che puoi interrogare 
via SQL? Oppure vuoi fare il tutto in delphi, per cercare di tenere questa
domanda in tema con questo newsgroup? :-D
 
ciao
Giacomo

 domanda in tema con questo newsgroup? :-D
 
La tabella e' in un Db firebird e i vari accessi li eseguo via firedac.
Dato che i creatori del gestionale hanno fatto per tutte le tipologie di 
dati una logica master-detail, per questa hanno pensato solo di fare una 
detail.
Pensandoci un po sto cercando di risolvere con una recursione.
Ecco la logica
 
Punto sul primo record della tabella e leggo la data, la salvo e entro in 
ciclo repeat unti.
Nel ciclo via sql filtro la tabella con
select Tabella.Data from Tabella where (Data<>dataprecedentemente letta)
se ho recordcount>0 leggo il primo record e salvo la seconda data.
nella select successiva aggiungo un and Data<>ultimadatatatrovata
e cosi' via finche' non ho recordcount=0
 
Domani provo....
 
Ciao e grazie
 
Daniele 
 

Ciao Giacomo,
  ho provato la logica nel messaggio precedente ...
 
Per funzionare funziona ma e' troppo lento perche' devo ciclare per 20 volte 
....
 
Deve esserci qualcosa di piu' rapido ....
 
Ciao
 
Daniele
 
 


Se sei su firebird, io eviterei la parte in delphi e farei con 
una bella query sql:
  SELECT DISTINCT Data FROM Tabella ;
 
Ti crea un DataSet in cui ha esattamente un solo record per 
ogni diverso valore di data.
 
ciao
Gacomo
 
 

 
 
"Daniele"  ha scritto nel messaggio news:oese0q$1ior$1...@gioia.aioe.org...

Ciao, più rapida (e semplice) è la query Distinct che ti ha appena suggerito 
Giacomo ..
 

 Giacomo ..
ovvero SELECT COUNT(*) as numero, campodata
GROUP BY campodata
ORDER BY campodata
così conosci quanti record sono stati inseriti ogni giorno
 
 

scusa mancava un pezzo
ovvero SELECT COUNT(*) as numero, campodata FROM Tabella


Ciao a tutti,
Grazie davvero ..... era quello che serviva !!!
 
Un saluto a tutti
 
Daniele

 ORDER BY campodata
 
Se fb la supporta, meglio questa sintassi:
 
SELECT COUNT(1) ............
       ^^^^^^^^
 

        ^^^^^^^^
??? 
http://stackoverflow.com/questions/1221559/count-vs-count1
 
 

       ^^^^^^^^
 
La sintassi e' supportata e con
 
Select Count(Distinct Data) from Tabella
 
ritorna il numero di date diverse (in questo caso 20).
Nel mio caso ho bisogno di sapere quali sono le 20 date e le risposte date 
dai tuoi colleghi sono state corrette e molto apprezzate.
 
Ciao
 
Daniele 
 

 SELECT COUNT(1) ............
 
Meglio per quale motivo? Spiega.
 

        ^^^^^^^^
 
Secondo le specifiche SQL, non c'è differenza tra SELECT COUNT(*) e
SELECT COUNT(1), ovvero per i planner (almeno per quello di SQL Server e
Oracle) il risultato è in teoria identico (in teoria perché su Oracle il
planner con SELECT COUNT(*) fa un index scan sulle colonne non nulle e
indicizzate). Insomma, è solo una questione di leggibilità, perché usare o la
prima o la seconda forma non porta alcun vantaggio tecnico
 
Enrico

 Oracle) il risultato è in teoria identico 
 
Forse c'era(no) differenze su alcuni engine di MySql.
Verifichero' su db2 e sybase appena ho un attimo.
 
A.

 Forse c'era(no) differenze su alcuni engine di MySql.
 
Non mi stupirei, MySQL ha un planner penoso
 
Enrico