MS Access/SQL Developer多值记录处理求助:展示记录及统计次数
数据库重复记录统计解决方案
场景1:按CUST_NO + DATE组合统计出现次数
如果需要统计每个CUST_NO和DATE组合的重复次数,同时保留该组合对应的完整记录内容,分两种情况实现:
支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等)
直接用窗口函数COUNT(*) OVER (PARTITION BY ...),无需分组丢失原记录:
SELECT CUST_NO, DATE, -- 替换为你表中实际需要展示的字段,比如交易金额、备注等 TRANS_AMOUNT, REMARK, -- 统计当前CUST_NO+DATE组合的出现次数 COUNT(*) OVER (PARTITION BY CUST_NO, DATE) AS occurrence_count FROM your_table_name;
不支持窗口函数的数据库(MySQL 5.x等)
用子查询分组统计后关联原表:
SELECT t1.CUST_NO, t1.DATE, t1.TRANS_AMOUNT, t1.REMARK, t2.occurrence_count FROM your_table_name t1 INNER JOIN ( -- 先分组统计每个CUST_NO+DATE的次数 SELECT CUST_NO, DATE, COUNT(*) AS occurrence_count FROM your_table_name GROUP BY CUST_NO, DATE ) t2 ON t1.CUST_NO = t2.CUST_NO AND t1.DATE = t2.DATE;
场景2:按CUST_NO统计总记录数
如果只需要统计每个客户(CUST_NO)的总出现次数,同时保留每条记录的详情:
窗口函数实现
SELECT CUST_NO, DATE, TRANS_AMOUNT, REMARK, -- 统计当前客户的总记录数 COUNT(*) OVER (PARTITION BY CUST_NO) AS total_cust_records FROM your_table_name;
子查询关联实现
SELECT t1.*, t2.total_cust_records FROM your_table_name t1 INNER JOIN ( SELECT CUST_NO, COUNT(*) AS total_cust_records FROM your_table_name GROUP BY CUST_NO ) t2 ON t1.CUST_NO = t2.CUST_NO;
特殊情况:单条记录内DATE字段含多值
如果DATE是数组、JSON等多值类型(比如同一条记录里DATE有多个重复值),需要先拆分多值再统计。以PostgreSQL的数组类型为例:
SELECT CUST_NO, -- 拆分数组为单个日期值 unnest(DATE) AS single_date, TRANS_AMOUNT, REMARK, -- 统计拆分后每个CUST_NO+单个日期的出现次数 COUNT(*) OVER (PARTITION BY CUST_NO, unnest(DATE)) AS date_occurrence FROM your_table_name;
注意:将上述代码中的
your_table_name、TRANS_AMOUNT、REMARK替换为你实际的表名和字段名。
内容的提问来源于stack exchange,提问作者Squelcha
相关产品推荐
相关产品推荐

