Эффективный способ одновременно вызывать c AVG и stddev_pop в postgres - PullRequest
0 голосов
/ 06 августа 2020

stddev_pop () должен вычислять AVG () как часть полного c стандартного отклонения (если нет ярлыка, о котором я не знаю).

для контекста, цель состоит в том, чтобы проверить для разницы в средних значениях этих двух столбцов geom.

Есть ли способ получить к нему доступ, чтобы избежать пересчета AVG ()?

вот пример запроса:

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 ;

и результат EXPLAIN ANALYZE, что заставляет меня думать, что если я запрошу avg () и stddev_pop (), он выполнит только avg () cal c один раз и повторно использует его?:

объяснять анализировать

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Чтобы объединить обе таблицы в один результат, вы должны агрегировать перед объединением:

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

или для получения одной строки в таблице:

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 ;
0 голосов
/ 06 августа 2020

согласно комментариям, я приписывал медленное время выполнения нескольким усредненным агрегациям, хотя на самом деле это было из-за ненужного соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...