PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Итериране през записи на PostgreSQL. Как да препратка към данни от следващия ред?

Обикновено трябва да изучите основите , преди да започнете да задавате въпроси.
Прочетете отличното ръководство за 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Прави заявка за таблица в postgres

  2. Достъп до външни XML файлове като променливи в PSQL скрипт (източник от bash скрипт)

  3. Актуализирайте записи, които отговарят на условие с нарастващо число

  4. Релсите търсят нагоре чрез сериализиран масив

  5. postgresql:тип данни за md5 съобщение?