0

バージョン 8.3 を使用する (選択の余地なし)。

「;WITH x AS」スタイルのクエリはサポートされていないため使用できません (8.3 でわかることから、それらを使用しようとしましたが、認識されません)。もちろん、SQL Server を使用していないため、TOP も使用できません。次の制限クエリを使用しようとしましたが、次のエラーが発生しました。

SELECT * FROM myView LIMIT(SELECT (COUNT(int_field) * 0.95)::integer FROM myView);

ERROR:  argument of LIMIT must not contain subqueries

下位 5% が削除されないので理想的ではありませんが、上位 5% が削除されるだけで生活できます。

4

1 に答える 1

1

Postgres 8.4 より前では、単一のクエリで行のパーセンテージを取得する組み込みの方法はありません。pgsql-sql リストのこの密接に関連するスレッドを検討してください

1 回の呼び出しで作業を行う関数を作成できます。これはPostgres 8.3で動作するはずです:

CREATE OR REPLACE FUNCTION foo(_pct int)
  RETURNS SETOF v_t AS
$func$
DECLARE
   _ct     int := (SELECT count(*) FROM v_t);
   _offset int := (_ct * $1) / 100;
   _limit  int := (_ct * (100 - 2 * $1)) / 100;
BEGIN

RETURN QUERY
SELECT *
FROM   v_t
OFFSET _offset
LIMIT  _limit;

END
$func$ LANGUAGE plpgsql;

電話:

SELECT * FROM foo(5)

これにより、実際には上下から 5% がトリミングされます

戻り値の型RETURNS SETOF v_tは、直接指定されたビューから派生しv_tます。

-> Postgres 8.3 のSQLfiddle 。

于 2013-07-11T17:25:09.870 に答える