PDA

View Full Version : [SQL] lista senza ripetizione di un valore


rayman2
10-10-2007, 22:35
Non sapevo bene che titolo dare al thread ma vi espongo brevemente il problema. Ho una query di per se semplice (questo è un esempio per evitare di spiegarvi eccessivamente lo schema che sto usando):


SELECT name, surname, age
FROM PERSON
ORDER BY age DESC
LIMIT 3


Ovvero scelgo le prime 3 persone in ordine di età dal più vecchio al più giovane.
Io vorrei però escludere da questi 3 le persone con lo stesso cognome, ovvero se due persone hanno lo stesso cognome non possono stare entrambe nella stessa lista.
Ad esempio nel DB:
Mario, Rossi, 45
Paolo, Verdi, 40
Marco, Bianchi, 15
Paolo, Rossi, 42

Attualmente la query restituisce:
Mario, Rossi, 45
Paolo, Rossi, 42
Paolo, Verdi, 40

Mentre io vorrei che Paolo Rossi fosse escluso perchè in lista c'è già un Rossi e dunque che la query restituisse:
Mario, Rossi, 45
Paolo, Verdi, 40
Marco, Bianchi, 15

Cosa mi suggerite?

0rph3n
10-10-2007, 23:08
SELECT DISTINCT ....

rayman2
11-10-2007, 08:11
No, non basta la distinct nel mio caso.

isAlreadyInUse
11-10-2007, 08:15
GROUP BY NAME?

0rph3n
11-10-2007, 08:37
No, non basta la distinct nel mio caso.

ops, non avevo letto per bene il tutto :stordita:
chiedo venia

rayman2
11-10-2007, 12:43
grazie, va benissimo il goup by surname.
Ne approfitto per approfondire: se invece volessi estendere questa caratteristica a due colonne invece che ad una?

Proseguendo l'esempio di prima:
Mario, Rossi, 45 c'è perchè è il più vecchio e in lista non ci sono altri Mario, nè altri Rossi
Paolo, Rossi, 42 no, perchè c'è già un'altro Rossi
Paolo, Verdi, 40 si perchè non c'è nessun Paolo e neanche un Verdi
Paolo, Rossi, 39 no perchè in lista c'è già un Paolo

isAlreadyInUse
11-10-2007, 12:44
group by name,surname

rayman2
11-10-2007, 13:13
ma così mi elimina quelli che hanno lo stesso nome AND lo stesso cognome: io vorrei stesso nome OR stesso cognome!

trallallero
11-10-2007, 13:30
guarda che
SELECT name, surname, age
con
GROUP BY surname
ti deve dare errore ;)

nella GROUP BY ci devono essere tutti i campi non gia´ raggruppati da funzioni (MAX, MIN, etc) selezionati

rayman2
11-10-2007, 13:41
in effetti negli appunti di SQL non avevo individuato il group by come costrutto utile...Fatto sta che pare funzionare...
Tu cosa suggerisci?

trallallero
11-10-2007, 13:49
in effetti negli appunti di SQL non avevo individuato il group by come costrutto utile...Fatto sta che pare funzionare...
Tu cosa suggerisci?

non so, non mi sembra facile senza cursore. Ma devo dire che non tocco Oracle da Marzo. Secondo me pero´ o usi un cursore o qualche query nidificata.

rayman2
11-10-2007, 16:36
vi faccio anche presente che sono vincolato a SQLite

Mixmar
11-10-2007, 20:05
Prova qualcosa del tipo:


SELECT name, surname, maxage AS MAX(age)
FROM PERSON
GROUP BY name, surname
ORDER BY maxage DESC


Edit: ops, mi rendo conto che questa risponde alla tua prima domanda, ma non alla seconda... :fagiano: