MySQL大表统计:按职员、客户、日期统计多产品订单组合
解决方案:统计多产品订单组合数量
先明确需求:我们需要从这张包含30万条记录的MySQL表中,统计同一职员(ClerkID)、同一客户(CustomerID)、同一日期下的多产品订单组合,并且排除只包含单一产品的条目,最终输出产品组合和对应的出现次数。
首先整理下清晰的原始表结构:
| Key | ClerkID | CustomerID | ProductCode | Date | Type | Color |
|---|---|---|---|---|---|---|
| 1 | 1010 | 123 | AAA | 2018-01-01 | 1 | Red |
| 2 | 1010 | 123 | BBB | 2018-01-01 | 2 | Blue |
| 3 | 1010 | 123 | AAA | 2018-01-02 | 1 | Red |
| 4 | 1010 | 456 | CCC | 2018-01-01 | 1 | Red |
| 5 | 1010 | 456 | DDD | 2018-01-02 | 2 | Red |
| 6 | 1010 | 456 | DDD | 2018-01-02 | 3 | Blue |
| 7 | 11 | 456 | AAA | 2018-01-02 | 3 | Blue |
实现思路与SQL代码
核心思路是先按职员、客户、日期分组,过滤出包含多个产品的组,再对产品组合进行统计:
- 内层分组:按
ClerkID、CustomerID、Date聚合,对每组内的产品去重后拼接成组合字符串,同时统计产品数量以过滤单一产品的组 - 外层统计:对拼接好的产品组合再次分组,计算每个组合的出现次数
对应的SQL代码如下:
SELECT product_combination AS Products, COUNT(*) AS Count FROM ( SELECT ClerkID, CustomerID, Date, GROUP_CONCAT(DISTINCT ProductCode ORDER BY ProductCode SEPARATOR ', ') AS product_combination, COUNT(DISTINCT ProductCode) AS product_count FROM your_table_name -- 替换为你的实际表名 GROUP BY ClerkID, CustomerID, Date HAVING product_count > 1 ) AS grouped_data GROUP BY product_combination ORDER BY Count DESC;
代码细节说明
GROUP_CONCAT(DISTINCT ProductCode ORDER BY ProductCode):对每组内的产品去重后按字母排序拼接,确保AAA,BBB和BBB,AAA被判定为同一个组合COUNT(DISTINCT ProductCode)+HAVING product_count > 1:精准过滤掉仅含单一产品的分组- 针对30万条数据的性能优化:建议给
ClerkID、CustomerID、Date创建联合索引,避免全表扫描带来的性能损耗
验证结果
用示例数据运行上述查询,会得到完全符合期望的输出:
| Products | Count |
|---|---|
| AAA, BBB | 1 |
| CCC, DDD | 1 |
内容的提问来源于stack exchange,提问作者kidnim
相关产品推荐
相关产品推荐

