两人之间的通话次数
题目分析:表给的是两个人之间的通话记录,难点在意3-4和4-3打电话其实是算同一种的,解决好这个问题就解决了所有问题。这个地方题目还特地强调了可能存在重复数据,那么其中的两个3-4-200到底算不算重复数据呢?真是疑惑。
首先使用if转换下数据,即把from_id都变成小的,to_id都变成大的
select if(from_id>to_id,to_id,from_id) from_id,if(from_id>to_id,from_id,to_id) to_id,duration from Calls
接着对这个数据进行group就可以了
select from_id person1,to_id person2,count(*) call_count,sum(duration) total_duration from (
select if(from_id>to_id,to_id,from_id) from_id,if(from_id>to_id,from_id,to_id) to_id,duration from Calls) F1 group by from_id,to_id
最后提交结果如下
那么现在思考下,加入3-4-200是重复的,怎么办呢?
应该可以这么解决
#先去重
select from_id,to_id,duration from Calls group by from_id,to_id,duration
#对去重的结果进行大小id的交换
select if(from_id>to_id,to_id,from_id) from_id,if(from_id>to_id,from_id,to_id) to_id,duration from (select from_id,to_id,duration from Calls group by from_id,to_id,duration) F1
#对拿到的数据进行求和即可
select from_id,to_id,count(*) call_count,sum(duration) total_duration from
(select if(from_id>to_id,to_id,from_id) from_id,if(from_id>to_id,from_id,to_id) to_id,duration from (select from_id,to_id,duration from Calls group by from_id,to_id,duration) F1) F2 group by from_id,to_id