我正在尝试编写一个循环,为每个 opp
返回 max(lead)
。现在,我只是返回一行空值。我做错了什么?
这是我的 table :
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;
甚至应该在 Postgres 8.2 中工作。
但这只是一个有根据的猜测,您的问题没有定论。
DISTINCT ON
的详细信息:
关于循环不返回值的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25251631/