[QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS

Ciao a tutti,

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:

select geom, max(ele), id from layerA
group by id

espandendo nl'elemento maggiore per ogni ai primi 3 elementi maggiori

Qualche spunto?

Grazie a tutti

Matteo

Ciao Matteo,

il problema non è per nulla banale da fare con l’SQL (magari sapendo un minimo programmare lo diventa).

In ogni caso con SL non saprei se funziona ma con postgresql puoi provare questo.

SELECT foo1.cat, primo, secondo, terzo FROM

(select cat, (array_agg(id order by id desc))[1] as primo
from
prova
group by cat) as foo1 JOIN

(select cat, (array_agg(id order by id desc))[2] as secondo
from
prova
group by cat) as foo2 ON (foo1.cat=foo2.cat) JOIN

(select cat, (array_agg(id order by id desc))[3] as terzo
from
prova
group by cat) as foo3 ON (foo2.cat=foo3.cat);

Con id come colonna univoca da cui estrarre i valori e cat come colonna di aggregazione.

Ciao!

···

Il giorno 1 febbraio 2017 14:54, matteo <matteo.ghetta@gmail.com> ha scritto:

Ciao a tutti,

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:

select geom, max(ele), id from layerA
group by id

espandendo nl’elemento maggiore per ogni ai primi 3 elementi maggiori

Qualche spunto?

Grazie a tutti

Matteo


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Sergio Gollino

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”.

Ciao Sergio,

il problema non è per nulla banale da fare con l'SQL (magari sapendo un
minimo programmare lo diventa).

infatti sto pensado di passare a python e vedere cosa succede

non ho postgres installato sul mio pc, cerco di tradurre per SL

Grazie!

Matteo

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 :slight_smile: 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);

Grazie a tutti

Matteo

ciao,
giuliano

Caro Giulinao (e tutti),

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

Saluti

Matteo

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

funziona :wink:

Con Postgis la cosa sarebbe semplice grazie alle funzioni finestra: https://www.postgresql.org/docs/9.3/static/functions-window.html

giovanni

···

Il 8 feb 2017 15:28, “matteo” <matteo.ghetta@gmail.com> ha scritto:

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

  1. ripeto il pricedimento 2 e 3, ma al punto 3 per le “seconde” vette
    maggiori attribuisco un valore = 2

  2. altra query sql in cui escludo sia il valore = 1 che valore = 3

funziona :wink:


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Il 08/02/2017 15:28, matteo ha scritto:

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

funziona :wink:
_______________________________________________
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Salve, ho realizzato uno script in pyqgis che farebbe al caso tuo, svolge il compito in una sola passata,

dopodichè hai un campo con gli ordinali della tua selezione su cui fare il filtro.

Potresti farmi avere il tuo layer cosi che possa testarlo e passartelo oppure se preferisci lo adatti direttamente tu

Saluti

Ciao Giulio,

sarei curioso di vedere lo script python che hai fatto e di come hai
usato una funzione di aggregazione

Grazie mille!

Matteo

Il 09/02/2017 15:42, matteo ha scritto:

Ciao Giulio,

sarei curioso di vedere lo script python che hai fatto e di come hai
usato una funzione di aggregazione

Grazie mille!

Matteo

In allegato il file da caricare nella console python, spero di essere stato abbastanza chiaro nei commenti per l'utilizzo

Saluti

Numerazione progressiva per raggruppamento.py (2.49 KB)