MySQL:如何提取同一tranxId下type重复出现的记录及统计次数
解决MySQL重复交易类型记录统计的问题
没问题,针对你这个需求,我给你整理了两种实用的SQL写法,完全匹配你要的输出格式:
方法一:直接分组统计(推荐,简洁高效)
这个写法直接通过分组和筛选,得到每个tranxId下出现次数超过1次的type及其次数,输出结果和你给出的示例完全一致:
SELECT tranxId, type, COUNT(*) AS occurrence_count FROM xyz -- 可选:如果表中可能存在非credit/debit的type值,加上这句过滤更严谨 WHERE type IN ('credit', 'debit') GROUP BY tranxId, type HAVING COUNT(*) > 1 ORDER BY tranxId, type;
逻辑说明:
GROUP BY tranxId, type:把相同交易ID和交易类型的记录归为一组COUNT(*):统计每组内的记录数量,也就是该tranxId下对应type的出现次数HAVING COUNT(*) > 1:只保留出现次数超过1次的分组ORDER BY:让结果按交易ID和类型排序,看起来更整齐
方法二:保留原表所有字段(如需查看具体记录)
如果你不仅需要统计次数,还想看到每条符合条件的原始记录,可以用窗口函数实现:
SELECT id, tranxId, type, occurrence_count FROM ( SELECT id, tranxId, type, -- 窗口函数计算每个tranxId+type组合的总次数 COUNT(*) OVER (PARTITION BY tranxId, type) AS occurrence_count FROM xyz WHERE type IN ('credit', 'debit') ) AS sub_query WHERE occurrence_count > 1 ORDER BY tranxId, type;
逻辑说明:
- 内层子查询用
PARTITION BY tranxId, type给每条记录标记它所属组的总次数 - 外层筛选出次数大于1的记录,这样你能同时看到原始的
id字段和对应的统计次数
这两种写法都能满足你的需求,根据实际场景选就行~
内容的提问来源于stack exchange,提问作者Degod Testra
相关产品推荐
相关产品推荐

