|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2000
Messaggi: 1209
|
[Postgres] Query un po Intrigata...
Scusatemi, mica potreste darmi una mano in una query bastarda che non riesco a eseguire ?
Nella tabella "query_result" ci sono una serie di telefonate da cellulare, Nel "campo1" ci sono i numeri di cellulare, Devo selezionare tutti i record dove il numero di cellulare non ha effettuato piu' di una chiamata, se un numero di cellulare ha effettueto anche solo 2 chiamate non devo selezionarne neppure una Database Postgres: --------------------------------------------- SELECT public.query_result.campo1, public.query_result.campo2, public.query_result.campo3, public.query_result.campo4, public.query_result.campo5 FROM public.query_result; |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Conti il numero di record per ciascun numero di telefono, e tieni solo quelli il cui conteggio e' proprio uguale ad 1
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2000
Messaggi: 1209
|
Domanda1:
----------------------------------------------- Devo selezionare tutti i record dove il numero di cellulare non ha effettuato piu' di una chiamata, se un numero di cellulare ha effettueto anche solo 2 chiamate non devo selezionarne neppure una Risposta1: ----------------------------------------------- Conti il numero di record per ciascun numero di telefono, e tieni solo quelli il cui conteggio e' proprio uguale ad 1 mi sembra che la domanda e la risposta coincidono, quindi e' un record doppio e quindi non e' da considerare, giusto ??? no dai, sto' schersando....., solo che il mio problema e' che non so come scriverla quella SELECT. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
select numero,count(*) cnt
FROM tabella GROUP BY numero HAVING count(*)=1
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Aug 2000
Messaggi: 1209
|
ERROR: column "query_result.campo1" must appear in the GROUP BY clause or be used in an aggregate function
dato che ho piu' campi da selezionare non mi funziona se non aggiungo tutti in group by, sai siamo su POSTGRES, ma allora se li metto tutti mi selezionera tutti i record e non solo quelli non duplicati........ Database Postgres: --------------------------------------------- SELECT public.query_result.campo1, public.query_result.campo2, public.query_result.campo3, public.query_result.campo4, public.query_result.campo5 FROM public.query_result; |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
devi fare le cose per gradi.
Prima cerchi i numeri di telefono con la query che ho messo su'. Poi usi quella query per tornare i join di nuovo con la tabella, per andare a prendere anche tutti gli altri campi di ciascuno dei numeri di telefono. Postgres ha detto bene, in SQL standard durante una query di gruppo non puoi ritornare qualcosa che non sia nella GROUP BY o una funzione di gruppo (o una costante) Chi lo permette (MySql) bara, e prima o poi ti riestituisce qualcosa che non ti aspetti.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Aug 2000
Messaggi: 1209
|
[quote=gugoXX;21600066]
Poi usi quella query per tornare i join di nuovo con la tabella, per andare a prendere anche tutti gli altri campi di ciascuno dei numeri di telefono.QUOTE] scusami ma sono troppo indietro in sql per cogliere il senso della tua indicazione, non ci arrivo proprio, e' la prima volta oggi che mi trovo a lavorare i dati in questo modo. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
SELECT * FROM tabella WHERE campo1 IN
(select campo1 FROM tabella GROUP BY campo1 HAVING count(*)=1) Ovvero, prendi tutti i record della tabella, il cui campo1 e' presente una sola volta nella tabella stessa.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Aug 2000
Messaggi: 1209
|
Perfetto, grande, veramente grazie, mi hai salvato da nolti casini, grazie ancora, a presto, ciao!!
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:29.