每日一题-39(两人之间的通话次数)

题39:

根据下表编写 SQL 语句,查询每一对用户 (person1, person2) 之间的通话次数和通话总时长,其中 person1 < person2 。
在这里插入图片描述
解题思路:
方法1、用UNION ALL重复也不合并
具体实现代码如下:

select person1, 
       person2, 
       COUNT(duration) as call_count,
       SUM(duration) as total_duration
from (--构建新表
    select from_id as person1, 
           to_id as person2, 
           duration
    from Calls where from_id < to_id--找出from_id < to_id所以信息
    union all
    select to_id as person1, 
           from_id as person2, 
           duration
    from Calls where to_id < from_id--找出from_id > to_id所以信息
    ) t--用union all连接两个表即可
group by person1, person2;

方法2、利用least和greatest的函数

  • 用least函数找出两个中最小的一个;
  • 用greatest函数找出两个中最大的一个;

这样可以将交叉相同的两个字段进行同一分组
具体实现代码如下:

select
    from_id as person1,
    to_id as person2,
    COUNT(*) as call_count,
    SUM(duration) as total_duration
from calls
group by least(from_id, to_id), greatest(from_id, to_id);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值