Postgresql 在多行的情况下使用带with子句的perform

Postgresql 在多行的情况下使用带with子句的perform,postgresql,Postgresql,我尝试将PERFORM与返回多行的with查询一起使用 CREATE OR REPLACE FUNCTION test_function() RETURNS void AS $$ BEGIN PERFORM ( WITH selection AS ( SELECT id, ROW_NUMBER() OVER w AS r, first_value(id) OVER w AS first_value, nth_value(id, 5) OVER w AS las

我尝试将PERFORM与返回多行的with查询一起使用

CREATE OR REPLACE FUNCTION test_function() RETURNS void AS $$

BEGIN

PERFORM (
WITH selection AS (
    SELECT id,
    ROW_NUMBER() OVER w AS r,
    first_value(id) OVER w AS first_value,
    nth_value(id, 5) OVER w AS last_value
    FROM mytable
    WINDOW w AS (PARTITION BY v.ability_id ORDER BY unit_id ASC)
)
create_question(id, 1, 1, 1) 
FROM selection
WHERE ability_id IN (
    SELECT ability_id
    FROM selection
    WHERE last_value > 0.5
    ORDER BY first_value DESC
)
AND selection.r <= 5
);

END;
$$ LANGUAGE plpgsql;
博士后说这是不可能的:

对于WITH查询,请使用“执行”,然后将查询放在括号中。(在这种情况下,查询只能返回一行。)


除了编写两次With查询(这里称为selection)之外,还可以做些什么来解决这个问题

备注:您的查询在
创建问题(id,1,1,1)
之前缺少一个
选择

诀窍是修改查询,使其返回一行

您可以通过使用聚合函数来实现这一点,例如写入:

SELECT
   count(create_question(id, 1, 1, 1))
FROM selection
...

然后,查询只返回一行,并且可以用作
PERFORM
语句中的子查询。

我看不到在您的CTE中选择了
ability\u id
。是的,我简化了查询,以提供我试图实现的功能。实际的那个有。
SELECT
   count(create_question(id, 1, 1, 1))
FROM selection
...