2

私は2つの入力パラメータ(rundate::datebranch::varchar)を取るgenerate_tableと呼ばれる関数を持っています

PLPGSQL を使用して、すべてのブランチのリストと各ブランチの最新の日付を取得し、これをパラメーターとして generate_table 関数に渡します。

私が持っているクエリは次のとおりです。

select max(rundate) as rundate, branch
from t_index_of_imported_files
group by branch

そして、これは次のようになります。

rundate;branch 
2014-03-13;branch1
2014-03-12;branch2
2014-03-10;branch3
2014-03-13;branch4

そして私が必要とするのは、関数がこのようなものを実行することです

select generate_table('2014-03-13';'branch1');
select generate_table('2014-03-12';'branch2');
select generate_table('2014-03-10';'branch3');
select generate_table('2014-03-13';'branch4');

私は PLPGSQL について多くのことを読んできましたが、これまでのところ、基本をほとんど知らないとしか言​​えません。

すべての値をまとめてから関数内で EXECUTE を使用するために連結を使用できることを読みましたが、正しく機能させることができませんでした。

これを行う方法に関する提案はありますか?

4

3 に答える 3

2

LATERAL JOINPostgres 9.3 以降の新機能を使用して、単純な SELECT クエリでこれを行うことができます。

SELECT *
FROM  (
   SELECT max(rundate) AS rundate, branch
   FROM   t_index_of_imported_files
   GROUP  BY branch
   ) t
 , generate_table(t.rundate, t.branch) g;  -- LATERAL is implicit here

ドキュメントごと:

LATERALは関数呼び出しFROMアイテムの前に置くこともできますが、この場合、関数式はFROMどのような場合でも前のアイテムを参照できるため、ノイズ ワードになります。

リスト内のセットを返す関数の行を展開することにより、古いバージョンでも同じことが可能ですSELECTが、 の新しい構文LATERALははるかにクリーンです。とにかく、Postgres 9.2 以前の場合:

SELECT generate_table(max(rundate), branch)
FROM   t_index_of_imported_files
GROUP  BY branch;
于 2014-03-14T16:33:06.067 に答える
0

派手すぎることをする必要はありません。

SELECT generate_table(rundate,branch) FROM (
    SELECT max(rundate) AS rundate, branch
    FROM t_index_of_imported_files
    GROUP BY branch) x;
于 2014-03-14T16:43:50.183 に答える
0
select generate_table(max(rundate) as rundate, branch)
from t_index_of_imported_files
group by branch
于 2014-03-14T16:43:43.633 に答える