Il linguaggio di programmazione Delphi
 

Parsing tabella

Daniele 9 Mag 2017 10:51
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 ******* indice sulla data, ma non so se e' possibile leggere l'indice
e tirare fuori le 20 date.

Scusate la b*****ita' ..... ma non mi viene in mente niente ....

Grazie

Daniele
Giacomo Degli Esposti 9 Mag 2017 14:13
Il giorno martedì 9 maggio 2017 10:51:03 UTC+2, Daniele ha scritto:
> 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 ******* indice sulla data, ma non so se e' possibile leggere
l'indice
> e tirare fuori le 20 date.
>
> Scusate la b*****ita' ..... ma non mi viene in mente niente ....

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
Daniele 9 Mag 2017 14:46
Ciao giacomo,

> 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

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
Daniele 9 Mag 2017 14:51
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
Giacomo Degli Esposti 9 Mag 2017 15:22
Il giorno martedì 9 maggio 2017 14:46:27 UTC+2, Daniele ha scritto:
> Ciao giacomo,
>
>> 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
>
> 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

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
Stark 9 Mag 2017 16:11
"Daniele" ha scritto nel messaggio news:oese0q$1ior$1@gioia.aioe.org...

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
Ciao, più rapida (e semplice) è la query Distinct che ti ha appena suggerito
Giacomo ..
brunello 9 Mag 2017 22:31
> Ciao, più rapida (e semplice) è la query Distinct che ti ha appena suggerito

> Giacomo ..
ovvero SELECT COUNT(*) as numero, campodata
GROUP BY campodata
ORDER BY campodata
così conosci quanti record sono stati inseriti ogni giorno
brunello 9 Mag 2017 22:41
scusa mancava un pezzo
ovvero SELECT COUNT(*) as numero, campodata FROM Tabella
GROUP BY campodata
ORDER BY campodata
Daniele 10 Mag 2017 12:21
Ciao a tutti,
Grazie davvero ..... era quello che serviva !!!

Un saluto a tutti

Daniele
Alberto Salvati 11 Mag 2017 08:39
> ovvero SELECT COUNT(*) as numero, campodata FROM Tabella
> GROUP BY campodata
> ORDER BY campodata

Se fb la supporta, meglio questa sintassi:

SELECT COUNT(1) ............
^^^^^^^^
brunello 11 Mag 2017 09:53
> SELECT COUNT(1) ............
> ^^^^^^^^
??? http://stackoverflow.com/questions/1221559/count-vs-count1
Daniele 11 Mag 2017 09:57
Ciao Alberto,
come vedi ogni tanto esco con qualche stranezza ...

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

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
4ndre4 11 Mag 2017 23:13
On Thursday, 11 May 2017 07:39:17 UTC+1, Alberto Salvati wrote:

> SELECT COUNT(1) ............

Meglio per quale motivo? Spiega.
Enrico Bianchi 12 Mag 2017 11:28
On 2017-05-11, Alberto Salvati <zzzato@gmail.com> wrote:

> SELECT COUNT(1) ............
> ^^^^^^^^

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
Alberto Salvati 16 Mag 2017 08:52
> Secondo le specifiche SQL, non c'è differenza tra SELECT COUNT(*) e
> SELECT COUNT(1),

Touchè.
Mea culpa, anni fa ad un corso su oracle9i ricordo che il docente disse che non
era la stessa cosa, e io, sbagliando, mi sono fidato senza andare a verificare.

Sono sorpreso.
Il docente non era uno che fa presentazioni powerpoint ma uno che
quotidianamente si smazzava *****i su oracle...

> ovvero per i planner (almeno per quello di SQL Server e
> 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.
Enrico Bianchi 16 Mag 2017 15:01
On 2017-05-16, Alberto Salvati <zzzato@gmail.com> wrote:

> Mea culpa, anni fa ad un corso su oracle9i ricordo che il docente disse che
> non era la stessa cosa, e io, sbagliando, mi sono fidato senza andare a
> verificare.

Od*****, forse su Oracle 9i la differenza c'era, ma oggi non è più così

> Forse c'era(no) differenze su alcuni engine di MySql.

Non mi stupirei, MySQL ha un planner penoso

Enrico

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.