Discussione:
Query: selezionare set record per data maggiore su raggruppamento parziale
(troppo vecchio per rispondere)
Shanty
2006-01-19 11:57:51 UTC
Permalink
Ciao ragazzi, premetto una cosa, son giorni che provo a cercare una
soluzione nel newsgroup dopo averci studiato da sola, quindi chiedo
venia se fosse già stato chiesto, ma non l'ho trovato!
La mia esigenza è questa, da una tab strutturata più o meno così:

Campo1 Campo2 Campo3
A 01/05/05 verde
A 05/10/05 rosso
A 18/03/05 blu
B 02/06/05 giallo
B 26/01/05 nero

Vorrei raggruppare per Campo1 determinare la data maggiore in Campo2 e
vedere il resto delle informazioni del record abbinato alla Data
Maggiore!
Cioè:
Campo1 Campo2 Campo3 CampoID etc....
A 05/10/05 rosso
B 02/06/05 giallo

Invece cosa succede quando eseguo una query di raggruppamento? essendo
costretta a raggruppare tutti i campi che voglio visualizzare, le info
si mescolano ed io non so se sbaglio ad usare la qry di raggruppamento
anzichè un altra, oppure se esiste un criterio, un opzione o che so
per dirgli di prelevare esattamente l'info così come da es.
So di essere arrugginita, nel corso dell'ultimo anno i miei problemi si
son attorniati su pannolini sporchi, pappe, biberon, levatacce notturne
ecc ecc ...
spero di avervi commosso a tal punto da indurvi ad aiutare una
neo-mamma a rimettersi un po' in linea con la programmazione in Access!
Grazie
Sha
giorgio rancati
2006-01-19 14:35:52 UTC
Permalink
Post by Shanty
Ciao ragazzi, premetto una cosa, son giorni che provo a cercare una
soluzione nel newsgroup dopo averci studiato da sola, quindi chiedo
venia se fosse già stato chiesto, ma non l'ho trovato!
Campo1 Campo2 Campo3
A 01/05/05 verde
A 05/10/05 rosso
A 18/03/05 blu
B 02/06/05 giallo
B 26/01/05 nero
Vorrei raggruppare per Campo1 determinare la data maggiore in Campo2 e
vedere il resto delle informazioni del record abbinato alla Data
Maggiore!
Campo1 Campo2 Campo3 CampoID etc....
A 05/10/05 rosso
B 02/06/05 giallo
[CUT]

Ciao Sha,

potresti fare in questo modo:
Crea una nuova query, inserisci la tua tabella, inserisci i campi Campo1 e
Campo2, premi il pulsante totali (quello per fare il raggruppamento), nella
riga Formula sotto Campo1 lascia raggruppamento mentre per Campo2 scegli
Max. Chiudi e salva con nome Query1
Crea una seconda query, aggiungi la tua tabella, aggiungi Query1, metti in
join Campo1 con Campo1 e Campo2 con MaxDiCampo2, esponi tutti i campi della
tua tabella ed esegui. Se non ho capito male dovrebbe dare il risultato che
cerchi.

Se vuoi rendere la query in lettura scrittura prendi in considerazione
questo esempio
----
SELECT *
FROM Tabella1
WHERE Campo2=(Select MAX(Campo2)
FROM Tabella1 Tb1
WHERE Tabella1.Campo1=Tb1.Campo1)
----

in pratica si tratta di fare una semplice query di selezione con solo la
Tabella1 e mettere nella riga criteri sotto il campo Campo2 la subquery
----
(Select MAX(Campo2) FROM Tabella1 Tb1 WHERE Tabella1.Campo1=Tb1.Campo1)
---
Post by Shanty
So di essere arrugginita, nel corso dell'ultimo anno i miei problemi si
son attorniati su pannolini sporchi, pappe, biberon, levatacce notturne
auguri :-)

Ciao
--
Giorgio Rancati
[Office Access MVP]
Shanty
2006-01-20 09:48:26 UTC
Permalink
Post by giorgio rancati
Ciao Sha,
Crea una nuova query, inserisci la tua tabella, inserisci i campi Campo1 e
Campo2, premi il pulsante totali (quello per fare il raggruppamento), nella
riga Formula sotto Campo1 lascia raggruppamento mentre per Campo2 scegli
Max. Chiudi e salva con nome Query1
Crea una seconda query, aggiungi la tua tabella, aggiungi Query1, metti in
join Campo1 con Campo1 e Campo2 con MaxDiCampo2, esponi tutti i campi della
tua tabella ed esegui. Se non ho capito male dovrebbe dare il risultato che
cerchi.
Grazie, anch'io avevo pensato a questa soluzione, il problema è che
può capitare che a parità di campo1 ci sono due record con la stessa
data ... ora stavo valutando se fare un ulteriore raggruppamento.
Post by giorgio rancati
Se vuoi rendere la query in lettura scrittura prendi in considerazione
questo esempio
----
SELECT *
FROM Tabella1
WHERE Campo2=(Select MAX(Campo2)
FROM Tabella1 Tb1
WHERE Tabella1.Campo1=Tb1.Campo1)
----
in pratica si tratta di fare una semplice query di selezione con solo la
Tabella1 e mettere nella riga criteri sotto il campo Campo2 la subquery
----
(Select MAX(Campo2) FROM Tabella1 Tb1 WHERE Tabella1.Campo1=Tb1.Campo1)
---
e poi ti faccio sapere!
Post by giorgio rancati
Post by Shanty
So di essere arrugginita, nel corso dell'ultimo anno i miei problemi si
son attorniati su pannolini sporchi, pappe, biberon, levatacce notturne
auguri :-)
Grazie
Sha
giorgio rancati
2006-01-20 10:42:26 UTC
Permalink
"Shanty" <***@yahoo.it> ha scritto nel messaggio news:***@g44g2000cwa.googlegroups.com...

[CUT]
Grazie, anch'io avevo pensato a questa soluzione, il problema è che
può capitare che a parità di campo1 ci sono due record con la stessa
data ... ora stavo valutando se fare un ulteriore raggruppamento.
Ma provo anche la tua seconda soluzione:
[CUT]
e poi ti faccio sapere!

be, no, otterresti un risultato identico alla prima query, a parità di data
hai bisogno di un campo che differisca le righe, ad esempio un contatore.

Ciao
--
Giorgio Rancati
[Office Access MVP]
giorgio rancati
2006-01-20 10:58:54 UTC
Permalink
Post by giorgio rancati
be, no, otterresti un risultato identico alla prima query, a parità di data
hai bisogno di un campo che differisca le righe, ad esempio un contatore.
se hai un campo ID contatore potresti fare così
----
SELECT *
FROM Tabella1
WHERE ID=(Select TOP 1 ID
FROM Tabella1 Tb1
WHERE Tabella1.Campo1=Tb1.Campo1
ORDER BY Campo2 DESC,ID DESC)
----


Ciao
--
Giorgio Rancati
[Office Access MVP]
Shanty
2006-01-20 10:58:33 UTC
Permalink
Siam collegati in contemporanea!!!

OK allora il campo ID c'è ora provo a fare come suggerisci!

tx
Sha
Shanty
2006-01-23 15:46:57 UTC
Permalink
Posso quasi dichiarare il mio amore per te! ;)

Solo che non riesco a finire di controllare tutti i dati ed essere
sicura che ho tutto correttamente!
In effetti questo criterio mi appesantisce notevolmente la selezione
(è una query su query!) sto studiandomi come risolvere la cosa!

Volevo finire prima di scrivere ma visto che son passati gg non volevo
sembrare irriconoscente!
Quindi grazie, ma non appena riuscirò a finire riscriverò la stringa!

Sha
giorgio rancati
2006-01-23 17:47:31 UTC
Permalink
Post by Shanty
Posso quasi dichiarare il mio amore per te! ;)
LOL
:-)
Post by Shanty
Solo che non riesco a finire di controllare tutti i dati ed essere
sicura che ho tutto correttamente!
In effetti questo criterio mi appesantisce notevolmente la selezione
(è una query su query!) sto studiandomi come risolvere la cosa!
be, in effetti se le righe sono tante c'è il problema del rallentamento, per
ogni riga della tabella viene eseguita la query nella clausola Where,
100.000 righe 100.000 esecuzioni.
Se crei un indice composto dai campi Campo1 ASC ,Campo2 DESC, ID DESC
dovresti notare qualche miglioramento.
Purtroppo il motore di Access è quello che è, con MSDE la stessa query
eseguita su una tabella con 500.000 righe impiega 8 secondi, se aggiungo
l'indice impiega 0,7 secondi. Con access e 100.000 righe non ho avito la
pazienza di aspettare :(
Post by Shanty
Volevo finire prima di scrivere ma visto che son passati gg non volevo
sembrare irriconoscente!
Quindi grazie, ma non appena riuscirò a finire riscriverò la stringa!
Sha
:-)

Ciao
--
Giorgio Rancati
[Office Access MVP]
giorgio rancati
2006-01-24 19:42:20 UTC
Permalink
"Shanty" <***@yahoo.it> ha scritto nel messaggio news:***@g47g2000cwa.googlegroups.com...
[CUT]
Post by Shanty
In effetti questo criterio mi appesantisce notevolmente la selezione
(è una query su query!) sto studiandomi come risolvere la cosa!
Ciao Shanty,
prova questa, al posto della subquery utilizza le tebelle derivate.
Impiega 1 secondo con 100.000 record
----
SELECT Tabella1.*
FROM Tabella1 INNER JOIN
(SELECT Campo1,Max(Campo2) AS MaxDiCampo2,LAST(Id) AS LastDiId
FROM (SELECT TOP 100 PERCENT Campo1,Campo2,Id
FROM Tabella1
ORDER BY Campo1,Campo2,Id) AS Tx
GROUP BY Campo1) Ty
ON Tabella1.Id=Ty.LastDiId
----

la *TOP 100 PERCENT * nella seconda tabella derivata è determinante per il
corretto funzionamento, se non la metti il LAST(ID) ritorna l'ultimo ID
insetiro in tabella per quel raggruppamento e non l'ultimo ID determinato
dall'order By per quel raggruppamento.

Ciao
--
Giorgio Rancati
[Office Access MVP]
Shanty
2006-01-26 14:58:07 UTC
Permalink
Post by giorgio rancati
Ciao Shanty,
prova questa, al posto della subquery utilizza le tebelle derivate.
Impiega 1 secondo con 100.000 record
----
SELECT Tabella1.*
FROM Tabella1 INNER JOIN
(SELECT Campo1,Max(Campo2) AS MaxDiCampo2,LAST(Id) AS LastDiId
FROM (SELECT TOP 100 PERCENT Campo1,Campo2,Id
FROM Tabella1
ORDER BY Campo1,Campo2,Id) AS Tx
GROUP BY Campo1) Ty
ON Tabella1.Id=Ty.LastDiId
----
la *TOP 100 PERCENT * nella seconda tabella derivata è determinante per il
corretto funzionamento, se non la metti il LAST(ID) ritorna l'ultimo ID
insetiro in tabella per quel raggruppamento e non l'ultimo ID determinato
dall'order By per quel raggruppamento.
Ciao
--
Giorgio Rancati
[Office Access MVP]
Mi correggo, son proprio costretta ad amarti!

Fantastico, fuori nevica da paura, tutti che mi dicono di andar a casa,
io testarda son rimasta apposta per provare la tua query e ta dan ...
perfetta!!!
Solo una piccola modifica:
nel SELECT van indicati tutti i campi coinvolti, perchè Access è
permaloso e non vuole l'asterisco per dei campi con delle formule ...
va bhe!
indi diventa:

----
SELECT Tabella1.Campo1,Tabella1.Campo2,Tabella1.id
FROM Tabella1 INNER JOIN
(SELECT Campo1,Max(Campo2) AS MaxDiCampo2,LAST(Id) AS LastDiId
FROM (SELECT TOP 100 PERCENT Campo1,Campo2,Id
FROM Tabella1
ORDER BY Campo1,Campo2,Id) AS Tx
GROUP BY Campo1) Ty
ON Tabella1.Id=Ty.LastDiId
----


Va, funzia alla velocità della luce ed io son commossa: era dai tempi
di SqlBase che non creavo delle query così!
Ti ringrazio davvero tanto per avermi aiutata a togliermi un po' di
ruggine, da sola ora come ora, non ci sarei mai riuscita!

Sha
giorgio rancati
2006-01-26 17:47:36 UTC
Permalink
"Shanty" <***@yahoo.it> ha scritto nel messaggio news:***@z14g2000cwz.googlegroups.com...
[CUT]
Post by Shanty
Va, funzia alla velocità della luce ed io son commossa: era dai tempi
di SqlBase che non creavo delle query così!
Ti ringrazio davvero tanto per avermi aiutata a togliermi un po' di
ruggine, da sola ora come ora, non ci sarei mai riuscita!
;-)
Post by Shanty
Sha
Ciao
--
Giorgio Rancati
[Office Access MVP]
MA
2006-01-26 17:44:56 UTC
Permalink
[CUT]
Post by Shanty
Va, funzia alla velocità della luce ed io son commossa: era dai tempi
di SqlBase che non creavo delle query così!
Ti ringrazio davvero tanto per avermi aiutata a togliermi un po' di
ruggine, da sola ora come ora, non ci sarei mai riuscita!
;-)
Post by Shanty
Sha
Ciao
me lo vedo a Giorgio con la lingua da fuori e carta vetro in mano...
molto divertente.
--
_ _
Ciao
MAssimiliano Amendola www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info: www.donkarl.com/it
giorgio rancati
2006-01-26 18:06:47 UTC
Permalink
Post by MA
me lo vedo a Giorgio con la lingua da fuori e carta vetro in mano...
molto divertente.
LOL
MA, sei una peste !!

comunque per il momento ho il badile in mano, qui sta nevicando a più non
posso.
--
Giorgio Rancati
[Office Access MVP]
MA
2006-01-26 18:06:34 UTC
Permalink
Post by giorgio rancati
Post by MA
me lo vedo a Giorgio con la lingua da fuori e carta vetro in mano...
molto divertente.
LOL
MA, sei una peste !!
comunque per il momento ho il badile in mano, qui sta nevicando a più
non posso.
Io invece sto uscendo con la canotta..
non so se ho il sex appeal di Costantino o Bossi...
Mah
--
_ _
Ciao
MAssimiliano Amendola www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info: www.donkarl.com/it
giorgio rancati
2006-01-27 11:27:49 UTC
Permalink
"Shanty" <***@yahoo.it> ha scritto nel messaggio news:***@z14g2000cwz.googlegroups.com...
giorgio rancati ha scritto:
[CUT]
Post by Shanty
Va, funzia alla velocità della luce ed io son commossa: era dai tempi
di SqlBase che non creavo delle query così!
ieri sera, per curiosità, ho posto il quesito su microsoft.public.it.sql,
(Ng dedicato a Ms Sql Server) chiedendo se era possibile fare una query
alternativa senza l'utilizzo della subquery nella clausola Where.

Ne è uscito qualcosa di interessante
----
SELECT t1.*
FROM Tabella1 t1 Inner Join
(SELECT max (id) as MaxIDPerTipo
FROM Tabella1 t1 Inner Join
(SELECT Campo1, Max (Campo2) as MaxCampo2
FROM Tabella1
GROUP BY Campo1
) s ON t1.Campo1= s.Campo1 and t1.Campo2= s.MaxCampo2
GROUP BY t1.Campo1, t1.Campo2) pk
ON t1.id= pk.MaxIDPerTipo
----
questa query è da preferirsi alla mia perchè rimane in un ambito ANSI (non
c'è la funzione LAST()) e non usa ordinamenti nella tabella derivata.

Ciao
--
Giorgio Rancati
[Office Access MVP]
Shanty
2006-02-07 13:51:07 UTC
Permalink
Post by giorgio rancati
ieri sera, per curiosità, ho posto il quesito su microsoft.public.it.sql,
(Ng dedicato a Ms Sql Server) chiedendo se era possibile fare una query
alternativa senza l'utilizzo della subquery nella clausola Where.
Ne è uscito qualcosa di interessante
----
SELECT t1.*
FROM Tabella1 t1 Inner Join
(SELECT max (id) as MaxIDPerTipo
FROM Tabella1 t1 Inner Join
(SELECT Campo1, Max (Campo2) as MaxCampo2
FROM Tabella1
GROUP BY Campo1
) s ON t1.Campo1= s.Campo1 and t1.Campo2= s.MaxCampo2
GROUP BY t1.Campo1, t1.Campo2) pk
ON t1.id= pk.MaxIDPerTipo
----
questa query è da preferirsi alla mia perchè rimane in un ambito ANSI (non
c'è la funzione LAST()) e non usa ordinamenti nella tabella derivata.
Ciao
--
Urca non avevo notato questa aggiunta ... mi ero fermata alla
Canotta!!!! he he he

da provare subito! .... la canotta naturalmente!!!

Sha
Shanty
2006-02-15 11:29:05 UTC
Permalink
Allora, sempre con un po' di giorni alle spalle ma ti posso garantire
di aver provato bene e il responso è questo:

la nuova soluzione è perfettamente funzionante, i dati risultanti
combaciano perfettamente

MA

la tua è decisamente più veloce!!! ^_^

INDI
chi volesse cimentarsi in una query del genere può usare
tranquillamente entrambe.

Grazie ancora di tutto
Shanty

Shanty
2006-01-20 10:55:18 UTC
Permalink
Post by giorgio rancati
be, no, otterresti un risultato identico alla prima query,
ok grazie lascio stare
Post by giorgio rancati
hai bisogno di un campo che differisca le righe, ad esempio un contatore.
il campo univoco c'è ma se non posso estrarlo con la prima Query torno
ad avere il problema iniziale
... miseriaccia potessi lavorarci costantemente c'ho na mezza idea ma
non posso farla subito
... son bloccata di continuo da altre cose ...
(in realtà questa query fa parte di una cascata di altre query,
aggiungerne altre mi fa venire il mal di pancia!
tutto perchè quando ho fatto questo DB non lavoravo con i codici
VisualAccess!)

Grazie ancora, resta inteso che se (SE) trovo la soluzione te lo faccio
sapere!

Ciao
Sha
Loading...