Удалите избыточный вызов функции для столбца и количества столбца

Проблема

В следующем запросе, plr_stations назван дважды:

  1. однажды для ограничения WHERE пункт; и
  2. однажды для подсчета количества результатов это возвратилось.

Код напоминает:

  SELECT
 m.*,
 s.*,
 (
  SELECT
    count(1)
  FROM
    climate.plr_stations('48.5146','-123.4447')
 ) AS count_stations
  FROM 
 climate.station s,
 climate.measurement m,
 (
  SELECT
    id
  FROM
    climate.plr_stations('48.5146','-123.4447')
 ) stations
  WHERE
    s.applicable AND
    s.id = stations.id AND
    m.station_id = s.id AND ...

Результаты этого запроса затем агрегированы запросом даты.

Решения

Заполните временную таблицу или переменную типа массив, с результатами вызова функции.

Обновление № 1

Вызов функции случайным образом выберет образец станций, если слишком много станций будут в сферическом полигоне, определенном параметрами к вызову функции.

Обновление № 2

Агрегирование запроса даты, которое запускает полные взгляды запроса следующим образом:

        SELECT 
          extract(YEAR FROM m.taken) AS year_taken,
          avg(m.amount) AS amount,
          count(m.amount) AS count_measurements,
          md.count_stations,
          min(md.elevation) AS elevation_min,
          max(md.elevation) AS elevation_max
        FROM
          climate.measurement m, (
          SELECT
            m.*,
            s.*, ...

Вопрос

Как еще избыточное может звонить быть устраненным?

Спасибо.

1
задан Dave Jarvis 24 June 2010 в 03:44
поделиться

1 ответ

Сомнительно, что он будет складываться, учитывая, что он не должен быть помечен как IMMUTABLE (если я правильно понимаю замысел).

Что-то в этом роде должно работать... в зависимости от ваших требований...

with R_stations as (
SELECT
     id,   
     count(1) over () c
      FROM
        climate.plr_stations('48.5146','-123.4447')
)
     SELECT
     m.*,
     s.*,
     stations.c count_stations
      FROM 
     climate.station s,
     climate.measurement m,
     R_stations stations
      WHERE
        s.applicable AND
        s.id = stations.id AND
        m.station_id = s.id AND ...

Но может быть проще, учитывая вашу агрегацию, просто сделать это...

 SELECT
 m.*,
 s.*,
 stations.c count_stations
  FROM 
 climate.station s,
 climate.measurement m,
 (SELECT
 id,   
 count(1) over () c
  FROM
    climate.plr_stations('48.5146','-123.4447')

) stations
      WHERE
        s.applicable AND
        s.id = stations.id AND
        m.station_id = s.id AND ...
2
ответ дан 2 September 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: