В следующем запросе, plr_stations
назван дважды:
WHERE
пункт; иКод напоминает:
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 ...
Результаты этого запроса затем агрегированы запросом даты.
Заполните временную таблицу или переменную типа массив, с результатами вызова функции.
Вызов функции случайным образом выберет образец станций, если слишком много станций будут в сферическом полигоне, определенном параметрами к вызову функции.
Агрегирование запроса даты, которое запускает полные взгляды запроса следующим образом:
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.*, ...
Как еще избыточное может звонить быть устраненным?
Спасибо.
Сомнительно, что он будет складываться, учитывая, что он не должен быть помечен как 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 ...