一、力扣链接
二、题目描述
表: Calls
+-------------+---------+ | Column Name | Type | +-------------+---------+ | from_id | int | | to_id | int | | duration | int | +-------------+---------+ 该表没有主键(具有唯一值的列),它可能包含重复项。 该表包含 from_id 与 to_id 间的一次电话的时长。 from_id != to_id
编写解决方案,统计每一对用户 (person1, person2)
之间的通话次数和通话总时长,其中 person1 < person2
。
以 任意顺序 返回结果表。
三、目标拆解
四、建表语句
Create table If Not Exists Calls (from_id int, to_id int, duration int)
Truncate table Calls
insert into Calls (from_id, to_id, duration) values ('1', '2', '59')
insert into Calls (from_id, to_id, duration) values ('2', '1', '11')
insert into Calls (from_id, to_id, duration) values ('1', '3', '20')
insert into Calls (from_id, to_id, duration) values ('3', '4', '100')
insert into Calls (from_id, to_id, duration) values ('3', '4', '200')
insert into Calls (from_id, to_id, duration) values ('3', '4', '200')
insert into Calls (from_id, to_id, duration) values ('4', '3', '499')
五、过程分析
1、判断from_id 是否大于to_id
2、按照from_id 和to_id 两个字段分组
六、代码实现
with t1 as (
select if(from_id > to_id, to_id, from_id) new_from_id,
if(from_id > to_id, from_id, to_id) new_to_id,
c.*
from calls c
)
select new_from_id person1,
new_to_id person2,
count(1) call_count,
sum(duration) total_duration
from t1 group by new_from_id, new_to_id;
七、结果验证
八、小结
1、使用if() 函数判断交换两个字段的位置
2、使用group by 分组后,count() 和sum() 聚合求次数和通话时长
标签:insert,Calls,into,力扣,values,SQL,duration,id,1699 From: https://blog.csdn.net/m0_59659684/article/details/143311128