PostgreSQL自定义函数:如何用FOR循环与RETURN统计冗余重复行
解决PostgreSQL统计重复行冗余次数的函数错误
你的代码主要有两个问题:
- FOR循环语法完全错误:plpgsql的FOR循环语法并非如此,且这里根本不需要循环——统计所有重复行的冗余次数(总次数-1的总和),一次聚合查询就能完成。
- 返回类型不合适:你要返回单个总数值,应该用
RETURNS INTEGER,而非SETOF INTEGER(后者用于返回多行结果集)。
正确的实现方式
方式1:SQL函数(更简洁高效)
因为逻辑简单,用SQL函数比plpgsql更合适:
CREATE OR REPLACE FUNCTION count_duplicates() RETURNS INTEGER AS $BODY$ SELECT SUM(qty - 1) FROM ( SELECT COUNT(*) AS qty FROM phones GROUP BY brand, naira_price, city, state, phone_condition, color HAVING COUNT(*) > 1 ) AS total; $BODY$ LANGUAGE sql;
方式2:plpgsql函数(若需用plpgsql)
如果坚持用plpgsql,也无需循环,直接查询赋值返回即可:
CREATE OR REPLACE FUNCTION count_duplicates() RETURNS INTEGER AS $BODY$ DECLARE total_dups INTEGER; BEGIN WITH total AS ( SELECT COUNT(*) AS qty FROM phones GROUP BY brand, naira_price, city, state, phone_condition, color HAVING COUNT(*) > 1 ) SELECT SUM(qty - 1) INTO total_dups FROM total; RETURN total_dups; END; $BODY$ LANGUAGE plpgsql;
调用方式
直接执行:
SELECT count_duplicates();
逻辑说明
- 先通过
GROUP BY分组,统计每个唯一行组合的出现次数qty,只保留出现次数大于1的组(即存在重复的行)。 - 对每个组计算
qty - 1(该组的冗余次数),求和后得到所有重复行的总冗余次数。
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

