8 votos

¿PostGIS- GROUP BY para valores de datos continuos?

En el código de ejemplo para el PostGIS ST_ConvexHull se crearían múltiples polígonos basados en diferentes valores discretos encontrados en el campo "tipo_de_enfermedad".

--Get estimate of infected area based on point observations
SELECT d.disease_type,
    ST_ConvexHull(ST_Collect(d.the_geom)) As the_geom
    FROM disease_obs As d
    GROUP BY d.disease_type;

Supongamos que hay un campo numérico (llamémoslo "myfield") con valores continuos de 0-5. ¿Cómo produciría resultados similares a los de GROUP BY pero definiendo sus propios puntos de ruptura (por ejemplo: 0-1,25, 1,25-3,5, 3,5-5)?

9voto

Pablo Puntos 6414

Puede utilizar CASE para crear clases. Algo así:

SELECT 
d.disease_type,
ST_ConvexHull(ST_Collect(d.the_geom)) As the_geom
FROM 
    (
    SELECT
    diseaseobs.the_geom,
    (CASE diseaseobs.number WHEN number BETWEEN 0 AND 1.5 THEN 'type one'
         WHEN number BETWEEN 1.6 AND 3 THEN 'type two'       
         ELSE 'other'
    END ) as disease_type
    FROM schema.diseaseobs

    ) AS d

GROUP BY d.disease_type;

2voto

Lars Mæhlum Puntos 4569

Hola

Lo que suelo hacer en esos casos es crear una tabla con las clases y unirlas o utilizar una subconsulta para crear una lista de clases.

Creo que eso da un enfoque más intuitivo y creo que es más flexible ya que se pueden actualizar las clases con sólo actualizar una tabla.

Otra ventaja es que también puedes conseguir las clases vacías.

el enfoque de la subconsulta podría ser algo así:

SELECT
d.disease_type,
ST_ConvexHull(ST_Collect(d.the_geom)) AS the_geom FROM disease_obs
RIGHT JOIN
(SELECT 0::float AS classbottom, 1.25::float AS classtop, 1::int AS classid
UNION ALL    
SELECT 1.25::float AS classbottom, 3.5::float AS classtop, 2::int AS classid
UNION ALL    
SELECT 3.5::float AS classbottom, 5::float AS classtop, 3::int AS classid) AS classes
ON disease_obs.continuous_value>=classes.classbottom AND disease_obs.continuous_value<classes.classbottom
GROUP BY classes.id;

Aquí utilicé una unión a la derecha para obtener también las clases vacías, lo que puede ser útil a veces. Si no quieres los vacíos sólo tienes que cambiar a una unión interna.

Si mueves las clases a una tabla y pones el resto de la consulta en una vista puedes cambiar las clases sin tocar la consulta.

HTH /Nicklas

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X