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

SQL统计重复行出现次数、去重并新增行计数列的实现方法

通用SQL实现方案

方案1:直接生成包含统计结果的查询结果

如果你只需要拿到去重加计数的结果集,不需要修改原表,直接用GROUP BY加聚合函数即可:

SELECT 
    name,
    country,
    price,
    COUNT(*) AS count
FROM 你的原表名
GROUP BY name, country, price;

注意:如果你的原结果集是临时查询出来的,把上面的你的原表名替换成你的子查询语句即可,比如你之前的查询是SELECT name,country,price FROM 业务表 WHERE xxx,替换后写法如下:

SELECT 
    name,
    country,
    price,
    COUNT(*) AS count
FROM (
    SELECT name,country,price FROM 业务表 WHERE xxx -- 替换成你原来的查询语句
) AS t
GROUP BY name, country, price;

方案2:修改原表实现去重+新增计数列

如果你需要把原表修改成去重加计数的结构,分三步操作:

  1. 先给原表新增count列
ALTER TABLE 你的原表名 ADD COLUMN count INT;
  1. 把重复行的计数更新到所有对应行
UPDATE 你的原表名 t1
JOIN (
    SELECT name, country, price, COUNT(*) AS cnt
    FROM 你的原表名
    GROUP BY name, country, price
) t2 ON t1.name = t2.name AND t1.country = t2.country AND t1.price = t2.price
SET t1.count = t2.cnt;
  1. 删除重复行,只保留每一组的第一条
-- MySQL 8.0+/PostgreSQL/Oracle等支持窗口函数的数据库可以用这个写法
DELETE FROM 你的原表名
WHERE (name, country, price, id) IN (
    SELECT name, country, price, id
    FROM (
        SELECT 
            id,
            ROW_NUMBER() OVER (PARTITION BY name, country, price ORDER BY id) AS rn
        FROM 你的原表名
    ) t
    WHERE rn > 1
);

如果你用的数据库不支持窗口函数,也可以用临时表中转的方式实现,先把去重后的数据存到临时表,清空原表再插回即可,这种方式性能更高,尤其适合你10万行量级的数据,处理速度比逐行删除快很多:

CREATE TEMPORARY TABLE temp_table AS
SELECT name, country, price, COUNT(*) AS count
FROM 你的原表名
GROUP BY name, country, price;

TRUNCATE TABLE 你的原表名;

INSERT INTO 你的原表名 (name, country, price, count)
SELECT name, country, price, count FROM temp_table;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:15:06