MySQL多表连接、去重计数及平均值计算技术求助
解决MySQL多表合并、去重计数与平均值计算问题
没问题,我来帮你搞定这个MySQL查询需求!结合你给出的表结构和需求,咱们一步步拆解实现:
1. 合并多张同结构表
因为你的table_a和table_b结构完全一致,需要把它们的数据集合并到一起,这里用UNION ALL是最优选择(比UNION更高效,因为不会自动去重,而你的两张表id不重复,不需要额外去重操作):
SELECT id, date, value FROM table_a UNION ALL SELECT id, date, value FROM table_b
这条语句会把两张表的所有行合并成一个统一的结果集,后续的统计操作都基于这个合并后的数据集。
2. 对id的出现次数进行Distinct去重计数
这里分两种常见场景,你可以根据实际需求选择:
- 场景1:统计不同id的总数量(即去重后的id个数)
SELECT COUNT(DISTINCT id) AS distinct_id_count FROM ( SELECT id FROM table_a UNION ALL SELECT id FROM table_b ) AS combined_tables
针对你的示例数据,这个查询会返回2,因为存在id=1和id=2两个不同的id。
- 场景2:统计每个id的去重后记录数(按date去重)
如果你的需求是统计每个id下不重复的date记录数(比如同一个id可能存在重复date的记录,需要去重统计),可以这样写:
SELECT id, COUNT(DISTINCT date) AS unique_date_count_per_id FROM ( SELECT id, date FROM table_a UNION ALL SELECT id, date FROM table_b ) AS combined_tables GROUP BY id
针对你的示例数据,每个id的date都是唯一的,所以会返回:
| id | unique_date_count_per_id |
|---|---|
| 1 | 4 |
| 2 | 4 |
3. 计算平均值
同样分两种常用场景:
- 场景1:计算所有value的整体平均值
基于合并后的所有value计算全局平均值:
SELECT AVG(value) AS overall_value_avg FROM ( SELECT value FROM table_a UNION ALL SELECT value FROM table_b ) AS combined_tables
针对你的示例数据,计算结果是(8+1+1+2+10+5+10+6)/8 = 43/8 = 5.375。
- 场景2:先算每个id的value平均值,再求这些平均值的整体平均
如果需要先按id分组计算单id的value平均值,再对这些平均值求整体平均,可以这样写:
SELECT AVG(id_avg) AS avg_of_id_avgs FROM ( SELECT id, AVG(value) AS id_avg FROM ( SELECT id, value FROM table_a UNION ALL SELECT id, value FROM table_b ) AS combined_tables GROUP BY id ) AS id_avg_results
针对你的示例数据,id=1的平均值是(8+1+1+2)/4=3,id=2的平均值是(10+5+10+6)/4=7.75,最终结果是(3+7.75)/2=5.375。
组合需求:一次性获取所有统计结果
如果你希望在一个查询里同时得到distinct id计数、整体value平均值、每个id的细分统计,可以用子查询组合实现:
SELECT (SELECT COUNT(DISTINCT id) FROM (SELECT id FROM table_a UNION ALL SELECT id FROM table_b) AS t) AS distinct_id_count, (SELECT AVG(value) FROM (SELECT value FROM table_a UNION ALL SELECT value FROM table_b) AS t) AS overall_value_avg, id, COUNT(DISTINCT date) AS unique_date_count_per_id, AVG(value) AS id_value_avg FROM ( SELECT id, date, value FROM table_a UNION ALL SELECT id, date, value FROM table_b ) AS combined_tables GROUP BY id
这样就能一次性满足你所有的需求啦!
内容的提问来源于stack exchange,提问作者user1692267
相关产品推荐
相关产品推荐

