Есть ли способ сделать последовательность с пользовательским поведением или аналогичными функциями? - PullRequest
1 голос
/ 30 апреля 2019

Я хочу сделать последовательность, которая дает мне случайные значения.Два последовательных вызова должны давать одинаковые значения, которые немного отличаются (с максимальным STEP).Означает, что я хочу сделать последовательность значений, которая изменяется плавно и в произвольном направлении.

Я сделал простую функцию, которая делает то, что я хочу.Но проблема в том, что он не может сохранить предыдущие значения.

CREATE OR REPLACE FUNCTION smooth_random_integer(VAL INTEGER, STEP INTEGER, MIN INTEGER, MAX INTEGER) RETURNS INTEGER
    AS
    $rand_smooth_integer$
    BEGIN
        VAL := VAL + floor(random() * (STEP * 2 + 1) - STEP);
        IF VAL > MAX THEN
            RETURN MAX;
        ELSIF VAL < MIN THEN
            RETURN MIN;
        END IF;
        RETURN VAL;
    END;
    $rand_smooth_integer$ LANGUAGE plpgsql;

Это означает, что вставка ниже дает очень похожие значения, всегда очень близко к исходной переменной.

INSERT INTO datapoint_values (ts, int_value)
    (SELECT ts, smooth_random_integer(INITIAL, STEP, MIN, MAX)
    FROM generate_series(TIMESTAMP_START, TIMESTAMP_END, TS_STEP) as ts);

Как я могупереписать мой код для достижения желаемого результата?

У меня была идея использовать последовательности.

Проблема с последовательностями postgresql заключается в том, что они 1) имеют стабильно определенный шаг и 2) всегда инкрементные или всегдадекремент.

Есть ли способ сделать то, что я хочу?Также приветствуются другие инструменты, кроме последовательностей.

Edit 1:

MIN, MAX, STEP и INITIAL определяются в начале скрипта.Они целые.Например, 0, 100, 2, 40.

generate_series (...) дает таблицу, которая производит метки времени от TIMESTAMP_START до TIMESTAMP_END с определенным шагом TS_STEP.

...