Stddev_pop () debe estar calculando AVG () como parte del cálculo completo de la desviación estándar (a menos que haya un atajo que desconozco).

Para el contexto, el objetivo es probar la diferencia de medias entre estas dos columnas geom.

¿Hay alguna forma de acceder a eso para evitar volver a calcular AVG ()?

Aquí hay una consulta de ejemplo:

select 
    avg(st_length(cons.geom)) as source_avg_length,
    avg(st_length(csn.geom)) as target_avg_length,
    stddev_pop(st_length(cons.geom)) as source_std_length,
    stddev_pop(st_length(csn.geom)) as target_std_length
from 
    received.conflation_osm_no_service cons,
    received.conflation_stress_network csn ;

Y la salida de EXPLAIN ANALYZE lo que me hace pensar que si pregunto por average () y stddev_pop (), ¿solo hará el cálculo avg () una vez y lo reutilizará ?:

explain analyze

0
Hugh_Kelley 6 ago. 2020 a las 18:06

2 respuestas

La mejor respuesta

Para combinar ambas tablas en un solo resultado, debe agregar antes de unirse:

select *
from 
 (  
   select 
       avg(st_length(geom)) as source_avg_length,
       stddev_pop(st_length(geom)) as source_std_length
   from received.conflation_osm_no_service cons
 ) as src
cross join
 (
   select 
       avg(st_length(geom)) as target_avg_length,
       stddev_pop(st_length(geom)) as target_std_length,
   from 
       received.conflation_stress_network csn ;
 ) as tgt

O para obtener una fila por tabla:

select 'source' as tablename,
    avg(st_length(geom)) as avg_length,
    stddev_pop(st_length(geom)) as std_length
from 
    received.conflation_osm_no_service cons

union all

select 'target',
    avg(st_length(geom)),
    stddev_pop(st_length(geom)),
from 
    received.conflation_stress_network csn ;
1
dnoeth 6 ago. 2020 a las 15:59

Según los comentarios, estaba atribuyendo tiempos de ejecución lentos a múltiples agregaciones promedio cuando en realidad se debía a una combinación innecesaria.

0
Hugh_Kelley 6 ago. 2020 a las 15:45