0

私のクロス集計クエリ (以下を参照) は問題なく実行されます。ただし、そのようなクエリを大量に生成する必要があり、重要なことに、列定義の数は日によって異なります。出力列定義の数がクロス集計の 2 番目の引数の数と一致しない場合、クロス集計はスローされ、エラーが発生して中止されます。したがって、現在のクエリのように列定義を「配線」することはできません。代わりに、列定義がオンザフライで同期されるようにする関数が必要です。そのようなすべてのインスタンスで再利用可能な一般的なpostgres関数を書くことは可能ですか? これが私のクエリです:

SELECT *
FROM crosstab
('SELECT 
to_char(ipstimestamp, ''mon DD HH24h'') As row_name, 
ips.objectid::text As category, 
COUNT(*)::integer As value
FROM loggingdb_ips_boolean As log 
INNER JOIN IpsObjects As ips 
ON log.Varid=ips.ObjectId
WHERE ((    log.varid = 37551) 
OR (log.varid = 27087)
OR (log.varid = 29469)   
OR (log.varid = 50876)
OR (log.varid = 45096)
OR (log.varid = 54708)
OR (log.varid = 47475)
OR (log.varid = 54606)
OR (log.varid = 25528)
OR (log.varid = 54729))
 GROUP BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, category     
 ORDER BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, category', 

 'SELECT DISTINCT varid 
 FROM loggingdb_ips_boolean ORDER BY 1;' 
 )

 As CountsPerHour(row_name text,  
 "25528" integer,
 "27087" integer,
 "29469" integer,
 "37551" integer,
 "45096" integer,
 "54606" integer,
 "54708" integer,
 "54729" integer)

PS: このクエリは、次のサーバーのテスト データに対して実行できることに注意してください: ホスト: bellariastrasse.com データベース: IpsLogging ユーザー: ゲスト パスワード: ゲスト

4

1 に答える 1

2

残念ながら、あなたが望んでいることは完全に可能ではありません。戻り値の型が異なる場合は、次のいずれかを実行できます

  • ジェネリックを返す関数を作成しますSETOF record

しかし、呼び出しごとに列定義リストを提供する必要があり、開始した場所にすぐに戻ることができます。

  • 異なるケースごとに一致する戻り値の型を持つ新しい関数を作成します。

しかし、それはあなたが避けようとしているものです...

「多数のそのようなクエリ」を作成する必要がある場合は、代わりにクエリ ジェネレーター関数を使用できます。これは、結果を返すのではなく、2 番目のステップで実行する DDL スクリプトを返します。基本的に、変数部分をパラメーターとして受け取り、例でクエリ文字列を生成する関数.. RETURNS text.

これはかなり複雑になる可能性があります。互いの上にいくつかのメタレベルを考慮する必要がありますが、それは絶対に可能です。引用の狂気を寄せ付けないように、ドルの引用を多用するようにしてください。

于 2012-06-22T01:32:37.777 に答える