Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在PL/pgSQL中编写此函数_Postgresql_Stored Procedures_Plpgsql_Window Functions - Fatal编程技术网

Postgresql 如何在PL/pgSQL中编写此函数

Postgresql 如何在PL/pgSQL中编写此函数,postgresql,stored-procedures,plpgsql,window-functions,Postgresql,Stored Procedures,Plpgsql,Window Functions,我有一个具有以下架构的表: CREATE TABLE foo ( the_date date, user_id int, pop REAL, hip REAL, lop REAL, cop REAL ); 我想编写一个函数foofunc(),该函数引用前一行并基于以下逻辑返回一个值: function foofunc() returns numeric as $body$ begin --

我有一个具有以下架构的表:

CREATE TABLE foo (
     the_date date,
     user_id  int,
     pop      REAL,
     hip      REAL,
     lop      REAL,
     cop      REAL
 );
我想编写一个函数
foofunc()
,该函数引用前一行并基于以下逻辑返回一个值:

function foofunc() returns numeric as $body$
begin
-- # calculate  (current_row.hip - current_row.lop) as val1 for current row
-- # calculate  abs(current_row.hip - previous_row.cop) as val2
-- # calculate  abs(current_row.lop - previous_row.cop) as val3 
-- RETURN max(val1, val2, val3)
end;
$body$ language plpgsql
我希望能够像这样调用函数
foofunc()

SELECT foofunc()
from foo 
where the_date between date1 and date2 
and user_id=some_id;
如何实现
foofunc()

假设“previous”是由
日期定义的

实际上,您不需要plpgsql函数来实现这一点。带有窗口函数的普通查询可以完成此任务,而且速度更快:

WITH x AS (
    SELECT *
          ,lag(cop,1,0::real) OVER (ORDER BY the_date) AS p_cop
    FROM   foo
    WHERE  the_date <= <date2> -- don't exclude earlier rows yet
    AND    user_id = <some_id>
    )
SELECT GREATEST (
       hip - lop
      ,@(hip - p_cop)
      ,@(lop - p_cop)
       )
FROM   x
WHERE  the_date >= <date1>
ORDER  BY the_date;
电话:


定义顺序。什么是“以前的”?谢谢欧文。除了冗长/简洁的PostgreSQl文档(大多数文档都没有提供有用的示例)之外,您是否可以推荐我阅读一个链接或一本书,以便能够编写类似于我自己的查询并增加我对SQL的了解?。例如,
WITH
best
对我来说都是新的关键字,我仍然不完全了解如何使用窗口功能,这意味着我将简单地复制和粘贴您提供的代码,而不是真正了解它的工作原理。我从优秀的手册和尝试中学到了很多。嗯,还有大学的基础知识。你可以浏览一下,试试搜索。有很多有用的例子。或仅我一个人就使用窗口功能发布了几十个答案。我已经在PostgreSQL工作了将近15年了,不要指望一天就学会所有的东西
CREATE OR REPLACE FUNCTION foofunc(_user_id int, _date date)
 RETURNS real AS
$BODY$
BEGIN

RETURN (
    WITH x AS (
        SELECT *
              ,lag(cop,1,0::real) OVER (ORDER BY the_date) AS p_cop
        FROM   foo
        )
    SELECT GREATEST(
         hip - lop
        ,@(hip - p_cop)
        ,@(lop - p_cop)
        )
    FROM   x
    WHERE  the_date = _date
    AND    user_id  = _user_id
    );

END;
$BODY$ language plpgsql;
SELECT foofunc(1, '2012-07-21');