【发布时间】:2017-10-29 03:03:25
【问题描述】:
我有一个看起来像这样的表:
table1
+----+-----+------+
| id | seq | test |
+----+-----+------+
| 1 | 1 | HR |
| 1 | 2 | RR |
| 2 | 1 | HR |
| 2 | 2 | RR |
| 2 | 3 | OXY |
| 3 | 1 | HR |
| 3 | 2 | RR |
| 4 | 1 | HR |
| 4 | 2 | RR |
| 4 | 3 | OXY |
+----+-----+------+
我想得到如下结果表。也就是说,只有当特定 id 的所有三个序列号都存在时,我才需要拥有特定 id 的所有行:
+----+-----+------+
| id | seq | test |
+----+-----+------+
| 2 | 1 | HR |
| 2 | 2 | RR |
| 2 | 3 | OXY |
| 4 | 1 | HR |
| 4 | 2 | RR |
| 4 | 3 | OXY |
+----+-----+------+
我期待着编写一个 plpgsql 函数来为我提供解决方案。我对 plpgsql 和一般编程比较陌生。如果有人帮助我获得结果,那就太好了。
到目前为止,这是我的功能的样子,但它不完整:
CREATE OR REPLACE FUNCTION test()
returns SETOF table1 AS $$
DECLARE
cur CURSOR FOR
SELECT *
FROM table1
ORDER by id;
rec_cur RECORD;
counter INTEGER DEFAULT 0;
BEGIN
OPEN cur;
FETCH FIRST FROM cur INTO rec_cur;
MOVE RELATIVE +1 FROM cur;
LOOP
FETCH cur INTO rec_cur;
EXIT WHEN NOT FOUND;
IF rec_cur.seq = 1 AND counter = 0 THEN
RETURN NEXT rec_cursor;
END IF;
END LOOP;
CLOSE cur;
RETURN;
END ; $$
LANGUAGE PLPGSQL STABLE PARALLEL SAFE;
【问题讨论】:
-
如果您将表格放在代码块中,它将保持格式化
-
非常感谢。我正要这样做。无论如何谢谢你:)
-
与往常一样,实际的表定义(
CREATE TABLE语句)将有助于澄清。最重要的是:(id, seq)是否定义为唯一且两列都不为空?还有其他可靠的元信息吗?并且总是提到你的 Postgres 版本。 Edit 需要澄清的问题。 -
@ErwinBrandstetter 非常感谢您提供的信息。当我问下一个问题时,我肯定会考虑你提到的几点。
标签: sql postgresql plpgsql relational-division