0

使用 8.3 版(在这件事上别无选择)。

我不能使用“;WITH x AS”样式查询,因为它不受支持(从我在 8.3 中可以看出。我试图使用它们但它们未被识别)。我当然也不能使用 TOP,因为我不在 SQL Server 中。我尝试使用以下限制查询,但因以下错误而受阻:

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 列表中考虑这个密切相关的线程

您可以编写一个函数在一次调用中完成这项工作。这应该在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 回答