Обикновено трябва да изучите основите , преди да започнете да задавате въпроси.
Прочетете отличното ръководство за CREATE FUNCTION
, PL/pgSQL
и SQL функции
.
Основни моменти защо примерът е глупост
-
Първо, не можете да предадете идентификатор като теб. Идентификаторите не могат да бъдат параметризирани в обикновен SQL. Ще ви трябва динамичен SQL за това.
Разбира се, всъщност не се нуждаете от това, според вашите изисквания. Има само една включена маса. Безсмислено е да се опитвате да го параметризирате. -
Не използвайте имена на типове като идентификатори. Използвам
_date
вместоdate
като име на параметър и преименува колоната на вашата таблица наasset_date
.ALTER
вашата дефиниция на таблицата съответно. -
Функция, извличаща данни от таблица, никога не може да бъде
IMMUTABLE
. Прочетете ръководството. -
Смесвате SQL синтаксис с plpgsql елементи по безсмислени начини.
WITH
е част отSELECT
оператор и не може да се смесва с plpgsql контролни структури катоLOOP
илиIF
.
Правилно функциониране
Една правилна функция може да изглежда така (един от многото начини):
CREATE FUNCTION percentage_change_func(_asset_symbol text)
RETURNS TABLE(asset_date date, price numeric, pct_change numeric) AS
$func$
DECLARE
last_price numeric;
BEGIN
FOR asset_date, price IN
SELECT a.asset_date, a.price
FROM asset_histories a
WHERE a.asset_symbol = _asset_symbol
ORDER BY a.asset_date -- traverse ascending
LOOP
pct_change := price / last_price; -- NULL if last_price is NULL
RETURN NEXT;
last_price := price;
END LOOP;
END
$func$ LANGUAGE plpgsql STABLE
Производителността не би трябвало да е толкова лоша, но е просто безсмислено усложнение.
Правилно решение:обикновена заявка
Най-простият (и вероятно най-бързият) начин би бил с функцията прозорец lag()
:
SELECT asset_date, price
,price / lag(price) OVER (ORDER BY asset_date) AS pct_change
FROM asset_histories
WHERE asset_symbol = _asset_symbol
ORDER BY asset_date;
Стандартно отклонение
Според по-късния ви коментар искате да изчислите статистически числа като стандартно отклонение.
Има специални обобщаващи функции за статистика
в PostgreSQL.