PDA

View Full Version : [SQL] 2 Valori massimi in un "group by"


Hurry Up
29-04-2009, 07:40
Ciao a tutti.... ho un problemino...

Ho un tabella con una "data", un "orario" e un "codice inserito"... io dovrei tirar fuori l'ultimo inserimento fatto, quindi la data maggiore, l'orario maggiore raggruppato per il codice.

Sembra tutto semplice ma facendo in questo modo recupero si la data maggiore, ma l'orario maggiore potrebbe essere quello di una data differente. Esempio:

DATA - ORA - CODICE
20090429 - 1423 - 001
20090428 - 1712 - 001

Con: "max(data), max(ora) group by codice" otterrei 20090429 1712 che ovviamente è errato.

Devo fare questa operazione obbligatoriamente da sql, perchè tiro fuori dal database milioni di codici e senza un group by l'AS400 si rifiuta direttamente di far partire la query per massimo tempo stimato :p

gugoXX
29-04-2009, 10:02
Ciao a tutti.... ho un problemino...

Ho un tabella con una "data", un "orario" e un "codice inserito"... io dovrei tirar fuori l'ultimo inserimento fatto, quindi la data maggiore, l'orario maggiore raggruppato per il codice.

Sembra tutto semplice ma facendo in questo modo recupero si la data maggiore, ma l'orario maggiore potrebbe essere quello di una data differente. Esempio:

DATA - ORA - CODICE
20090429 - 1423 - 001
20090428 - 1712 - 001

Con: "max(data), max(ora) group by codice" otterrei 20090429 1712 che ovviamente è errato.

Devo fare questa operazione obbligatoriamente da sql, perchè tiro fuori dal database milioni di codici e senza un group by l'AS400 si rifiuta direttamente di far partire la query per massimo tempo stimato :p

A causa di uno dei limiti dell'SQL standard, non e' agevole fare quello che vuoi fare.
La soluzione corretta e' piu' complessa di uno dei classici WorkAround, ed e' probabilmente anche piu' complessa algoritmicamente per l'engine.

Chiamata || la funzione di concatenazione di stringa, (Ogni motore ha questa funzione, ma non e' standard, quindi cerca quella per il tuo),
chiamata "CAST" la funzione per convertire da un tipo di dati ad un altro (Ogni motore serio ha la sua, talvolta chiamata Convert, talvolta CAST, etc)
Allora la soluzione che ti consiglio e' la seguente.


SELECT Codice, MAX( CAST(Data as string) || '-' || CAST(Ora as string)) AS maxd
FROM Tabella
GROUP BY Codice


Se poi ti serve splittare il nuovo campo maxd nei rispettivi Data e Ora, allora dovrai ulteriormente giocare selezionando da questo risultato e applicando le variee funzioni di split, substr e riconversione specifiche.

Hurry Up
29-04-2009, 10:39
Direi che la soluzione è perfetta... :D Ci mette un poco in più per eseguire la query ma va benissimo :)

Grazie mille, mi hai salvato :D

Hiskrtapps
29-04-2009, 11:47
forse una roba tipo:

select data, max(ora)... where data = select max(data)...

potrebbe avere prestazioni migliori...