我正在用PostgreSQL 9.2编写一个函数。
对于包含股票价格和日期的表,我希望计算每个条目相对于前一天的百分比变化。对于数据的最早日期,将没有前一天,因此该条目可以简单地为零。
我知道WITH
语句可能不应该在IF
语句之上,这就是我迄今为止从逻辑上考虑它的方式:
CREATE FUNCTION percentage_change_func(asset_histories)
RETURNS numeric LANGUAGE sql IMMUTABLE AS
$func$
DECLARE
r asset_histories%rowtype
BEGIN
WITH twodaysdata AS (SELECT date,price,asset_symbol FROM asset_histories
WHERE asset_symbol = $1.asset_symbol
AND asset_histories.date <= $1.date
ORDER BY date DESC LIMIT 2),
numberofrecords AS (SELECT count(*) FROM twodaysdata)
IF numberofrecords = 2 THEN
RETURN r.price / (r+1).price - 1 <---How do I reference r + 1??/
ELSE
RETURN NIL
ENDIF
END
$func$;
如何正确引用下一行的数据?
2条答案
按热度按时间rlcwz9us1#
我想计算每个条目与前一天相比的百分比变化
先学习基础知识。阅读关于
CREATE FUNCTION
、PL/pgSQL和SQL functions的优秀手册。这个例子毫无意义的主要原因
当然,实际上你的目标并不需要。这里只涉及一个表。将它参数化是没有意义的。
_date
而不是date
作为参数名,并相应地将您的表列重命名为asset_date
。ALTER
您的表定义。IMMUTABLE
。不要将其声明为Read the manual.。WITH
是SELECT
语句的一部分,不能与LOOP
或IF
等PL/pgSQL控制结构混合。已清理的函数
一个适当的函数可能如下所示(多种方式之一):
性能应该不会这么差,但还是毫无意义的复杂化。
正确的解决方案:普通查询
最简单(也可能是最快)的方法是使用窗口函数
lag()
:标准偏差
根据您后面的评论,您希望计算统计数字,如标准差。
Postgres有专门的统计数据聚合函数。
4c8rllxm2#
像计算
per_change
这样简单的事情,可以在view
内完成,这也会导致更快的结果要查看库存详细信息,您可以使用