我正在尝试提取与特定日期相对应的记录数,以及在数据库中的下一个日期没有相应user_id的user_ids。这是我试图完成它的方式(使用plpgsql但不定义函数:
DO
$BODY$
DECLARE
a date[]:= array(select distinct start_of_period from monthly_rankings where balance_type=2);
res int[] = '{}';
BEGIN
FOR i IN array_lower(a,1) .. array_upper(a,1)-1
LOOP
res:=array_append(res,'SELECT COUNT(user_id) from (select user_id from monthly_rankings where start_of_period=a[i] except select user_id from monthly_rankings where start_of_period=a[i+1]) as b');
i:=i+1;
END LOOP;
RETURN res;
$BODY$ language plpgsql
我得到一个错误:无法检索结果:ERROR:RETURN在函数返回void时没有参数 第11行:返回res; 我是这种程序语言的新手,无法发现函数返回void的原因。我确实将值赋给变量,并且我声明为空 - 不是NULL - 数组。是否有语法或更重要的推理错误?
答案 0 :(得分:3)
1。)您不能RETURN
语句中的WITH x AS (
SELECT DISTINCT start_of_period
,rank() OVER (ORDER BY start_of_period) AS rn
FROM monthly_rankings
WHERE balance_type = 2
)
SELECT x.start_of_period, count(*) AS user_ct
FROM x
JOIN monthly_rankings m USING (start_of_period)
WHERE NOT EXISTS (
SELECT 1
FROM x x1
JOIN monthly_rankings m1 USING (start_of_period)
WHERE x1.rn = x.rn + 1
-- AND m1.balance_type = 2 -- only with matching criteria?
AND m1.user_id = m.user_id
)
-- AND balance_type = 2 -- all user_id from these dates?
GROUP BY x.start_of_period
ORDER BY x.start_of_period
。你必须改为DO
。
2。)你不需要这些。使用此查询,其速度将提高一个数量级:
start_of_period
这包括最后一个符合条件的{{1}},您可能希望将其排除在plpgsql代码中。