Function 循环不返回值的函数

Function 循环不返回值的函数,function,postgresql,loops,greatest-n-per-group,Function,Postgresql,Loops,Greatest N Per Group,我试图编写一个循环,为每个opp返回maxlead。现在,我只是返回一行null。我做错了什么 这是我的桌子: CREATE TEMP TABLE mytable ( opp text , pty_id text , lead int); INSERT INTO mytable VALUES ('A', '01', 1) ,('A', '01', 2) ,('A', '01', 3) ,('B', '01', 1) ,('B', '01', 2) ,('B', '01', 3) ,('

我试图编写一个循环,为每个opp返回maxlead。现在,我只是返回一行null。我做错了什么

这是我的桌子:

CREATE TEMP TABLE mytable (
  opp  text
, pty_id text 
, lead int);

INSERT INTO mytable VALUES
('A', '01', 1)
,('A', '01', 2)
,('A', '01', 3)
,('B', '01', 1)
,('B', '01', 2)
,('B', '01', 3)
,('C', '02', 4)
,('C', '02', 5)
,('D', '01', 1)
,('D', '01', 2)
,('D', '01', 3);
以下是函数:

DROP FUNCTION grp_prod();
CREATE OR REPLACE FUNCTION grp_prod()
  RETURNS TABLE (
    opp text
  , pty_id text
  , lead int
  , result int) AS
$BODY$
DECLARE
    r mytable%ROWTYPE;
BEGIN
    opp    := $1; 
    pty_id  := $2;  
    lead := $3;
    result  := null;
FOR r IN
    SELECT *
    FROM mytable m
    ORDER BY m.opp, m.lead
LOOP
    IF (r.opp, r.lead) <> (opp, lead) THEN 
        RETURN NEXT;
        opp    := r.opp;
        lead   := r.lead;
        result  := 1;
    END IF;

    result := MAX(lead);
END LOOP;
RETURN NEXT; 
END;
$BODY$ LANGUAGE plpgsql STABLE;

select * from grp_prod();

我真的很感谢你在这里提供的任何帮助。如果我的要求不清楚,如果您还有任何问题,请告诉我。

您的功能在太多地方被破坏。 看起来您可以改为使用此简单查询:

SELECT DISTINCT ON (opp)
       *
FROM   mytable
ORDER  BY opp, lead DESC;
甚至应该在博士后8.2中工作。 但这只是一个有根据的猜测,你的问题没有结论

有关的详细信息:


如果您真的想要一个函数来运行此功能,这将适用于您:

CREATE or replace FUNCTION test.grp_prod()
    RETURNS SETOF mytable AS
$BODY$
BEGIN

    RETURN QUERY SELECT DISTINCT ON (opp) opp,pty_id,MAX(lead) OVER (PARTITION BY opp) FROM mytable;
END
$BODY$
    LANGUAGE plpgsql STABLE;

SELECT * FROM grp_prod()
但是,当您可以简单地运行查询以获得所需的结果时,这似乎是不必要的

结果:

首先,您的PostgreSQL版本是什么?8.2.15。。。我想一个问题是这个指针不起作用。我想你的第一个问题是指针。如果可能,请升级到当前版本。如果不可能,至少升级到最新的point release 8.2.23。抱歉,maxlead只是更复杂标准的占位符,我将在后面插入。我只是想让循环的结构正常工作。谢谢