You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL自定义函数:如何用FOR循环与RETURN统计冗余重复行

解决PostgreSQL统计重复行冗余次数的函数错误

你的代码主要有两个问题:

  1. FOR循环语法完全错误:plpgsql的FOR循环语法并非如此,且这里根本不需要循环——统计所有重复行的冗余次数(总次数-1的总和),一次聚合查询就能完成。
  2. 返回类型不合适:你要返回单个总数值,应该用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();

逻辑说明

  1. 先通过GROUP BY分组,统计每个唯一行组合的出现次数qty,只保留出现次数大于1的组(即存在重复的行)。
  2. 对每个组计算qty - 1(该组的冗余次数),求和后得到所有重复行的总冗余次数。

内容的提问来源于stack exchange,提问作者Kelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:43:16