1

問題

次のクエリでplr_stationsは、 が 2 回呼び出されます。

  1. WHERE句を制限するために 1 回。と
  2. 返された結果の数をカウントするために 1 回。

コードは次のようになります。

  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.*, ...

質問

他にどのようにして冗長な呼び出しを排除できますか?

ありがとうございました。

4

1 に答える 1

2

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 ...
于 2010-06-24T03:37:06.543 に答える