当前位置: 首页 > 面试题库 >

遍历PostgreSQL记录。如何参考下一行的数据?

尉迟景福
2023-03-14
问题内容

我是PostgreSQL的新手,在这里编写函数非常困难。所以我希望有人可以帮助我知道该怎么做。

我有一张股票价格和日期表。我想为每个条目计算与前一天相比的变化百分比。对于最早的数据,不会有前一天的记录,因此条目可以简单地为Nil。有人可以查看我的功能并为我提供
以下帮助:a)如何引用下一行的数据,以及
b)帮助我清理数据?

我知道该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$

PostgreSQL 9.2。


问题答案:

我想为每个条目计算与前一天相比的变化百分比。

通常,在开始提出问题之前,您需要 学习基础知识
阅读优秀的手动约 CREATE FUNCTIONPL /
pgSQL的

SQL函数

要点-为什么这个例子是胡说八道

  • 首先,您不能像您一样上交 标识符 。不能在普通SQL中对标识符进行参数化。为此,您需要 动态SQL
    当然,根据您的要求,您实际上并不需要。仅涉及一张桌子。尝试对其进行参数化是胡说八道。

  • 不要使用类型名称作为标识符。我使用_date而不是date作为参数名称,并将您的表列重命名为asset_dateALTER您的表定义相应。

  • 从表中获取数据的功能永远不可能IMMUTABLE。阅读手册。

  • 您正在以荒谬的方式将SQL语法与plpgsql元素混合在一起。WITHSELECT语句的一部分,不能与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

性能不应该那么差,但这只是毫无意义的复杂性。

正确的解决方案:简单查询

最简单(可能最快)的方法是使用window函数
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中
有专用的
聚合函数用于统计



 类似资料:
  • 问题内容: 我被困在如何循环行集并保存在变量中。 请注意,这可能是伪代码,因为SQL不是我的专长。 如您所见,我正在遍历客户,在该循环中,我需要获取当前余额并将其设置为零,但是首先我需要确定它是正数还是负数,以便能够确定插入的是AR_Transactions表中的每个用户都必须为正数或负数。您能帮忙解决遗失的物品吗? 问题答案: 这是将原始代码直接转换为有效的SQL Server语法的方法。我无法

  • 本文向大家介绍Yii遍历行下每列数据的方法,包括了Yii遍历行下每列数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Yii遍历行下每列数据的方法。分享给大家供大家参考,具体如下: 效果图如下: 控制器(1种): (2种): 视图层: 更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《

  • 问题内容: 我有一个目录日志文件。我想使用Python脚本处理此目录中的每个文件。 我该怎么做呢? 问题答案: 使用或,取决于您是否要递归执行。

  • 问题内容: 我在Linux上用bash编写脚本,需要遍历给定目录中的所有子目录名称。如何遍历这些目录(并跳过常规文件)? 例如: 给定目录是 它具有以下子目录: 我想检索A,B,C。 问题答案: 简短说明: 查找文件(很明显) 是当前目录,它位于is之后(恕我直言,它比直接包含在命令中更为灵活。如果要在此文件夹中执行更多操作,则只有一个位置可以更改,)。 并确保仅在当前目录中查找,并且不将自身包含

  • 问题内容: 我试图将两个数组排列在一起,结果总是不正确。我将向您展示我的代码,获得的结果以及正在寻找的结果。 我想我只是做错了,但不确定其他方法。 我的代码: 结果:(缩短以节省空间) 我正在寻找的结果如下: 问题答案: 问题 嗯,问题当然出在您嵌套的foreach循环上。因为对于数组的每个元素,您都循环遍历整个数组(所以总共有* 次迭代)。 解决方案 为了解决这个问题,您必须一次遍历两个数组。

  • X1.4.0新增 sp_scan_dir($pattern,$flags) 功能: 替代scan_dir的方法 参数: $pattern:检索模式 搜索模式 .txt,.doc; (同glog方法) $flags:返回模式 同glog方法 返回: 类型数组 使用方法: //扫描application目录 $files=sp_scan_dir('application/*');//返回applic