2014-09-17 2 views
0

У меня есть таблица с сериями месяцев с совокупной активностью, например.Plpgsql - Итерация по набору записей несколько раз

month | activity

Jan-15 | 20

Feb-15 | 22

У меня также есть ряд порогов в другой таблице, например. 50, 100, 200. Мне нужно получить дату, когда достигнут порог, т. Е. Активность> = порог.

То, как я думал об этом, заключается в том, чтобы функция pgsql, которая читается в таблице пороговых значений, выполняет итерацию над этим курсором и считывает в таблице месяцев курсор, а затем выполняет итерацию по этим строкам, составляя месяц, где порог . По соображениям производительности, вместо того, чтобы каждый раз выбирать все строки в таблице месяцев, я возвращался в первую строку в курсоре и повторно перебирал новое значение из таблицы пороговых значений.

Является ли это разумным способом решения проблемы? Это то, что у меня есть до сих пор - я получаю ошибку ERROR: cursor "curs" already in use.

CREATE OR REPLACE FUNCTION schema.function() 
    RETURNS SETOF schema.row_type AS 
    $BODY$ 
    DECLARE 
rec RECORD; 
rectimeline RECORD; 
notification_threshold int; 
notification_text text; 
notification_date date; 
output_rec schema.row_type; 
curs SCROLL CURSOR FOR select * from schema.another_function_returning_set(); -- this is months table 
curs2 CURSOR FOR select * from schema.notifications_table; 

BEGIN 
OPEN curs; 
FOR rec IN curs2 LOOP 
notification_threshold := rec.threshold; 
LOOP 
FETCH curs INTO rectimeline; -- this line seems to be the problem - not sure why cursor is closing 
IF notification_threshold >= rectimeline.activity_total THEN 
notification_text := rec.housing_notification_text; 
notification_date := rectimeline.active_date; 
SELECT notification_text, notification_date INTO output_rec.notification_text, output_rec.notification_date; 
MOVE FIRST from curs; 
RETURN NEXT output_rec; 
END IF; 
END LOOP; 
END LOOP; 
RETURN; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 

ответ

1
select distinct on (t.threshold) * 
from 
    thresholds t 
    inner join 
    months m on t.threshold < m.activity 
order by t.threshold desc, m.month 
+0

Doh! Я думал, что-то вроде этого может работать, но я уволил его - никогда не недооценивайте силу sql! Он работал только тогда, когда я изменил его на «месяцы m на t.threshold

+0

@Stev_k _It работал только тогда, когда я изменил его на «месяцы m на t.threshold

+0

забавно, нет, я этого не делал. Я бы подумал, что это было бы необходимо, поскольку я думал, что отдельный выбирает первую уникальную запись, но, похоже, она работает нормально для меня, не меняя порядок - не знаю, почему. –

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