【LC中等】1699. 两人之间的通话次数

❤️博客主页: 楚生辉
❤️系列专栏:【LeetCode刷题】
❤️一句短话: 坚持不懈,孜孜不倦

1.题目描述

员工表:Calls

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| from_id     | int     |
| to_id       | int     |
| duration    | int     |
+-------------+---------+
该表没有主键,可能存在重复项。
该表包含 from_id 与 to_id 间的一次电话的时长。
from_id != to_id

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

以 任意顺序 返回结果表。

查询结果格式如下示例所示。

输入:
Calls 表:
+---------+-------+----------+
| from_id | to_id | duration |
+---------+-------+----------+
| 1       | 2     | 59       |
| 2       | 1     | 11       |
| 1       | 3     | 20       |
| 3       | 4     | 100      |
| 3       | 4     | 200      |
| 3       | 4     | 200      |
| 4       | 3     | 499      |
+---------+-------+----------+
输出:
+---------+---------+------------+----------------+
| person1 | person2 | call_count | total_duration |
+---------+---------+------------+----------------+
| 1       | 2       | 2          | 70             |
| 1       | 3       | 1          | 20             |
| 3       | 4       | 4          | 999            |
+---------+---------+------------+----------------+
解释:
用户 12 打过 2 次电话,总时长为 70 (59 + 11)。
用户 13 打过 1 次电话,总时长为 20。
用户 34 打过 4 次电话,总时长为 999 (100 + 200 + 200 + 499)

2.代码实现

  • 方法一:巧妙使用IF

观察Calls,我们发现如果from_idto_id之前永远是前面小与后面的,那么这一道题就会变得非常的简单,因此我们可以使用IF判断来实现from_idto_id的顺序调转

SELECT
    IF(from_id<to_id,from_id,to_id) person1,
    IF(from_id>to_id,from_id,to_id) person2,
    COUNT(to_id ) as call_count,
    SUM(duration) as total_duration
FROM
    Calls
GROUP BY person1,person2
  • 方法二:自联结
select 
    from_id person1,
    to_id person2,
    count(1) call_count,
    sum(duration) total_duration
from 
    (
        select * from Calls where from_id < to_id
        union all
        select to_id from_id,from_id to_id,duration from Calls where from_id > to_id
    ) t
group by 
    1,2 
order by 
    1,2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楚生辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值