Newsgroup: it.comp.appl.access
Titolo: Problema query per selezionare righe con data maggiore di altre

Ho un problema che non riesco a risolvere
Una tabella, con colonne  id, data, ora, targa, auto, autista, ditta
Bene, il campo id ovviamente e' sempre diverso ma gli altri campi possono 
anche essere uguali a parte la tripleta  data/ora/targa
La tabella serve per tenere un archivio delle auto in uso ad un certo 
autista e ad una certa ditta
I campi data ed ora indicano che "ad iniziare da quella data/ora il mezzo 
con targa xyz e' in uso all'autista Pippo della ditta Master srl"
Mi serve una selezione che visualizzi le righe che, per ogni targa, hanno 
data/ora maggiore delle altre e minore/uguale della data/ora corrente
Questo perche' nella tabella ci sono righe che hanno date anche future
Quindi se la tabella contiene cinque righe con la stessa targa, di quelle 
cinque righe vorrei visualizzare solo una e precisamente quella con data/ora 
maggiore tra le cinque righe che abbiano data/ora minore o uguale alla 
data/ora corrente.
Vorrei anche che visualizzare il valore Id di quella riga
Sono partito con il goupby per targa, cercando di visualizzare il max(data) 
di ogni gruppo dopo aver escluso le righe con data/ora maggiore della 
data/ora corrente, ma cosi facendo non riesco ad avere l'id della singola 
riga (perche' dovrei inserirlo come funzione di aggregazione e non e' quello 
che voglio)
Mi sto incartando in una query che a prima vista non sembra neanche tanto 
difficile
Come fareste?
Ciao e grazie
RobertoA
 
 
 

 wrote in
news:lh0l2s$p9q$
1...@virtdiesel.mng.cu.mi.it
: 

secondo me la complicazione dipende dalla struttura del db.
 
io userei come minimo 3 tabelle:
- mezzo
- autista
- tabella di cross mezzo/autista che contiene oltre agli id due campi 
data/ora (datada, dataa)
 
a seconda della situazione potrebbe aver senso creare altre due tabelle:
- azienda
- cross azienda/autista
 
scritto in linguaggio spannometrico, la base della query che ti serve 
potrebbe essere:
select * from [cross mezzo/autista] where dataa is null and datada < now
 
 
a quanto sopra devi poi attaccare in join le tabelle mezzo e autista per 
ottenere la situazione completa.
 
 
-- 
Paolo opg
 
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 ha scritto nel messaggio 
news:XnsA2FD5BE8CA992sp...@193.43.96.1...

Il problema non sta nel numero tabelle
Sta nella selezione
Devo raggruppare le righe che hanno stessa targa, per ogni gruppo 
visualizzare i solo i dati della riga con data/ora  maggiore tra loro
Il problema del raggruppamento e' che nella select devo inserire le funzioni 
di aggregazione per i campi che devo visualizzare, altrimenti non saprebbe 
che valore visualizzarmi
Allora nella selezione della query ho provato ad usare una subquery del 
tipo:     where  DATA  in  (select max(DATA) as DATA_MAX  from TABELLA group 
by TARGA)
Ma anche se la subquery visualizza correttamente i record, supponiamo 1000, 
poi quando ci attacco la query principale la corrispondenza 1 a 1 che vorrei 
visualizzare va a farsi benedire e la visualizzazione finale mostra molta 
roba in piu' dei 1000 record filtrati dalla subquery
Ed e' anche normale perche' il collegamento tra  la query e la subquery sta 
sul campo DATA ed e' sicuramente scorretto cosi'
 
 
 
 
 

 
 
il trucco sta nel mettere il raggruppamento come in join e non nella 
select.
la query in sql spannometrico:
 
select *
from tabellainsulsa TI
join (
select con max(data), eventuale where con data<now e groupby targa
) X on X.targa = TI.targa and X.maxdata = TI.data
 
la fregatura e' dietro l'angolo: se il campo 'data' contiene solo la data e 
la stessa targa e' usata due volte in un giorno sei di nuovo col qlo per 
terra.
se pero' il campo data in realta' e' data/ora allora ti salvi almeno da 
questo padulo.


 Paolo opg
 
 
Posso intervenire sulla struttura
Oltre al campo DATA c'e' un altro campo ORA
Un mezzo (stessa TARGA) potrebbe esistere con stessa DATA ma ORA diversa
In sostanza la tripleta  targa/data/ora e' sicuramente univoca
Supponendo di separare i dati su tabelle mezzi/autisti/tabella_cross, come 
faresti la query per ottenere le informazioni sull'auto attualmente 
disponibile?
 
 
 
 
 

 
 
con la struttura che ho proposto io userei qualcosa di questo tipo:
 
select *
from mezzo m
left join (
    	select idmezzo from [cross mezzo/autista] where datada < now and dataa 
is null
) x on x.idmezzo = m.idmezzo
where x.idmezzo is null
 
con il campo ora separato va considerato anche quello nella subselect sulla 
cross


 Paolo opg
 
Ringrazio molto per la risposta
Appena possibile provero' anche questa possibilita'