leetcode中等之1699.两人之间的通话次数

表: Calls
Column NameType
from_idint
to_idint
durationint

该表没有主键,可能存在重复项。
该表包含 from_id 与 to_id 间的一次电话的时长。
from_id != to_id

问题

编写 SQL 语句,查询每一对用户 (person1, person2) 之间的通话次数和通话总时长,其中 person1 < person2 。

以 任意顺序 返回结果表。

示例

示例 1:

输入:
Calls 表:

from_idto_idduration
1259
2111
1320
34100
34200
34200
43499

输出:

person1person2call_counttotal_duration
12270
13120
344999

解释:
用户 1 和 2 打过 2 次电话,总时长为 70 (59 + 11)。
用户 1 和 3 打过 1 次电话,总时长为 20。
用户 3 和 4 打过 4 次电话,总时长为 999 (100 + 200 + 200 + 499)。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-calls-between-two-persons
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

法一:控制group by 条件
select distinct from_id person1,
        to_id person2,
       count(from_id) call_count,
       sum(duration) total_duration
from calls 
group by if(from_id<to_id,from_id,to_id),if(from_id>to_id,from_id,to_id)
法二:union all拼接表
select from_id person1,
        to_id person2,
       count(from_id) call_count,
       sum(duration) total_duration
from (
    select * from calls where from_id<to_id
    union all
    select to_id,from_id,duration from calls where from_id>to_id
    ) t
group by from_id,to_id 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值