循环函数不返回值

时间:2014-08-11 20:14:22

标签: function postgresql loops greatest-n-per-group

我正在尝试为每个max(lead)编写一个返回opp的循环。现在,我只是返回一行空值。我做错了什么?

这是我的表:

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();

我非常感谢您在这里提供的任何帮助。如果我的要求不清楚,如果您有任何其他问题,请告诉我。

2 个答案:

答案 0 :(得分:0)

你的功能在很多地方都被破坏了 看起来您可以使用这个简单的查询:

SELECT DISTINCT ON (opp)
       *
FROM   mytable
ORDER  BY opp, lead DESC;

甚至可以在Postgres 8.2中使用 但这只是一个有根据的猜测,你的问题是不确定的。

DISTINCT ON的详细信息:

答案 1 :(得分:0)

如果你真的想要一个函数来运行它,这将适合你:

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()

但是,只需运行查询即可获得所需的结果,这似乎是不必要的。

结果: Max lead of each opp