2013-07-11 1 views
0

Использование версии 8.3 (нет выбора в этом вопросе).postgresql: выберите не-извержения из вида

Я не могу использовать запросы стиля «; x 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% удаляются.

+0

У Вас нет»на самом деле объяснил, что вы ожидали от этого запроса. Это 95% строк? Если да, то в соответствии с тем, какое выражение для заказа? –

ответ

1

Перед Postgres 8.4 нет встроенного способа получить процент строк с одним запросом. Рассмотрим this closely related thread on the pgsql-sql list

Вы можете написать функцию, выполняющую работу за один вызов. это должно работать в 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.

->SQLfiddle for Postgres 8.3.

+0

Пытался создать эту функцию и получил следующую ошибку: ERROR: язык «plpgsql» не существует СОВЕТ: Используйте CREATE LANGUAGE для загрузки языка в базу данных. – lostinthebits

+0

Извините, я создал этот язык. Я думал, что у меня могут не быть прав на это. Но теперь я получаю «тип» v_t «не существует». – lostinthebits

+0

@lostinthebits: Замените все вхождения 'v_t' на фактическое имя вашего представления или таблицы. Это может быть сделано [generic с полиморфным типом] (http://stackoverflow.com/questions/11740256/refactor-a-pl-pgsql-function-to-return-the-output-of-various-select-queries/ 11751557 # 11751557), но Postgres 8.3 слишком устарел и не имеет ['pg_typeof()') (http://www.postgresql.org/docs/current/interactive/functions-info.html#FUNCTIONS-INFO- КАТАЛОГ СТОЛ). Таким образом, функция работает только для одного объекта. –

Смежные вопросы