Questo messaggio, comprensivo di eventuali allegati, è ad uso esclusivo del destinatario e potrebbe contenere informazioni riservate; se è stato recapitato per errore ci scusiamo per l’accaduto e Vi invitiamo cortesemente a darcene notizia provvedendo alla sua distruzione.
Vi ricordiamo che la diffusione, l’utilizzo e/o la conservazione dei dati ricevuti per errore costituiscono violazione alle disposizioni del D.Lgs. n. 196/2003 “Codice in materia di protezione dei dati personali”.
On 2/1/17, matteo <matteo.ghetta@gmail.com> wrote:
Ciao a tutti,
ciao Matteo,
ho un problemino che pensavo fosse semplice e invece mi sta facendo
diventare matto.
Ho un layer in QGIS (caricato anche in un DB SL) dove ho una colonna
numerica e un'altra colonna con un id (diciamo di aggregazione).
Sto inutilmente cercando di estrarre i primi 3 valori maggiori della
colonna numerica per ogni id, ovvero trasformare questa semplice query:
.......................
Qualche spunto?
per il prelievo dei primi 3 elementi proverei a:
- generare una vista ottenuta da un SELECT * FROM .... ORDER BY ele
- aggiungerei un campo 'ord' (durante la creazione o a posteriori)
autoincrementale (mi sembra si possa anche se non ne ho esperienza
diretta o più semplicemente si può forse utilizzare ROWID
- estrarrei dalla vista i primi 3 elementi con SELETC * FROM ....
WHERE ord < 4 (o ROWID < 4);
per confinare la ricerca in ogni categoria metterei una clausola WHERE
id = categoria_voluta nella prima query e ripeterei il metodo detto
sopra per ogni categoria (penso che si possa anche automatizzare il
tutto con istruzioni nidificate, ma.....
prima di smadonnare ricorda che il suggerimento arriva da uno
abbastanza profano di SQL da essere perdonato per le eventuali
castronerie (ma abbastanza interessato di conoscere la soluzione
migliore che spero posterai);
ho risolto artigianalmente (a volte sono le soluzioni migliori però)..
1. lanciare la query sul mio layer in modo che trovi i 3 elementi
maggiori (sono picchi montuosi) per ogni gruppo
2. carico come nuovo layer e faccio una bella "seleziona per posizione"
dove seleziono in input il layer con tutti i punti che è UGUALE al layer
caricato
3. inverto la selezione (cosi ho tutti i picchi meno i 3 maggiori per
ogni gruppo) e ricarico solo la selezione in SL
4. rilancio la query sul layer caricato e ottengo i, diciamo, secondi 3
picchi maggiori..
ripeto la procedura dove aggiungo alla selezione entrambi i layer dei
picchi..
artigianale e brutto lo so, ma funzionale...
Grazie a tutti e ovviamente, se qualcuno ha un'idea migliore e meno
artigianale sono tutto orecchi
Forse ho una soluzione migliore anche se comunque un po' "manuale"..
1. prima query sql in cui etraggo le prime vette dallo shape
2. faccio una "Selezione per posizione" in modo da avere le vette più
alte **selezionate** nel layer con tutte le vette
3. aggiungo una colonna e aggiungo valori = 0 per tutti le vette e
valore = 1 per le vette più alte
4. altra query sql in cui escludo le vette che hanno valore = 1
select geom, id, name, max(ele), valore from peaks
where valore != 0
group by id
5. ripeto il pricedimento 2 e 3, ma al punto 3 per le "seconde" vette
maggiori attribuisco un valore = 2
6. altra query sql in cui escludo sia il valore = 1 che valore = 3
Forse ho una soluzione migliore anche se comunque un po' "manuale"..
1. prima query sql in cui etraggo le prime vette dallo shape
2. faccio una "Selezione per posizione" in modo da avere le vette più
alte **selezionate** nel layer con tutte le vette
3. aggiungo una colonna e aggiungo valori = 0 per tutti le vette e
valore = 1 per le vette più alte
4. altra query sql in cui escludo le vette che hanno valore = 1
select geom, id, name, max(ele), valore from peaks
where valore != 0
group by id
5. ripeto il pricedimento 2 e 3, ma al punto 3 per le "seconde" vette
maggiori attribuisco un valore = 2
6. altra query sql in cui escludo sia il valore = 1 che valore = 3