循环不返回值的函数

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

我正在尝试编写一个循环,为每个 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/

相关文章:

django - 在 Django 中测试全文搜索触发器

JavaScript 性能 : Loop and indexOf with large Arrays

c - union 和通用功能

javascript - 为什么代码片段会这样输出?

php - 多个 php 类(Symfony Controller )可访问的函数

postgresql - 无法\复制到具有默认 clock_timestamp 的 postgresql 表中

使用 Microsoft Visual Studio 在 Windows 64 位上为 PostgreSQL 数据库创建 C 函数 dll

java - 使用 ArrayList 显示多个 vector 对象 Java

linux - 为什么遍历一组 linux 文件即使没有匹配项也总是返回 1?

javascript - 控制台日志输出整个函数而不是返回的内容