3124. 查找最长的电话

力扣题目跳转(3124. 查找最长的电话 - 力扣(LeetCode)

表:Contacts

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| first_name  | varchar |
| last_name   | varchar |
+-------------+---------+
id 是这张表的主键(有不同值的列)。
id 是 Calls 表的外键(引用列)。
这张表的每一行都包含 id,first_name 和 last_name。

表:Calls

+-------------+------+
| Column Name | Type |
+-------------+------+
| contact_id  | int  |
| type        | enum |
| duration    | int  |
+-------------+------+
(contact_id, type, duration) 是这张表的主键(有不同值的列)。
type 字段是 ('incoming', 'outgoing') 的 ENUM (category)。
这张表的每一行包含有 calls, 包括 contact_id,type 和以秒为单位的 duration 的信息。

 题目要求:

编写一个解决方案来找到 三个最长的呼入 和 呼出 电话。

返回结果表,以 typeduration 和 first_name 降序排序 ,duration 的格式必须为 HH:MM:SS

结果格式如下所示。

示例 1:

输入:

Contacts 表:

+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
| 1  | John       | Doe       |
| 2  | Jane       | Smith     |
| 3  | Alice      | Johnson   |
| 4  | Michael    | Brown     |
| 5  | Emily      | Davis     |
+----+------------+-----------+        

Calls 表:

+------------+----------+----------+
| contact_id | type     | duration |
+------------+----------+----------+
| 1          | incoming | 120      |
| 1          | outgoing | 180      |
| 2          | incoming | 300      |
| 2          | outgoing | 240      |
| 3          | incoming | 150      |
| 3          | outgoing | 360      |
| 4          | incoming | 420      |
| 4          | outgoing | 200      |
| 5          | incoming | 180      |
| 5          | outgoing | 280      |
+------------+----------+----------+
        

输出:

+-----------+----------+-------------------+
| first_name| type     | duration_formatted|
+-----------+----------+-------------------+
| Michael   | incoming | 00:07:00          |
| Jane      | incoming | 00:05:00          |
| Emily     | incoming | 00:03:00          |
| Alice     | outgoing | 00:06:00          |
| Emily     | outgoing | 00:04:40          |
| Jane      | outgoing | 00:04:00          |
+-----------+----------+-------------------+
        

解释:

  • Michael 有一通长达 7 分钟的呼入电话。
  • Jane 有一通长达 5 分钟的呼入电话。
  • Emily 有一通长达 3 分钟的呼入电话。
  • Alice 有一通长达 6 分钟的呼出电话。
  • Emily 有一通长达 4 分 40 秒的呼出电话。
  • Jane 有一通长达 4 分钟的呼出电话。

注意:输出表以 type,duration 和 first_name 降序排序。

case 1 的建表语句。

Create table if Not Exists Contacts(id int, first_name varchar(20), last_name varchar(20))
Create table if Not Exists Calls(contact_id int, type ENUM('incoming', 'outgoing'), duration int)
Truncate table Contacts
insert into Contacts (id, first_name, last_name) values ('1', 'John', 'Doe')
insert into Contacts (id, first_name, last_name) values ('2', 'Jane', 'Smith')
insert into Contacts (id, first_name, last_name) values ('3', 'Alice', 'Johnson')
insert into Contacts (id, first_name, last_name) values ('4', 'Michael', 'Brown')
insert into Contacts (id, first_name, last_name) values ('5', 'Emily', 'Davis')
Truncate table Calls
insert into Calls (contact_id, type, duration) values ('1', 'incoming', '120')
insert into Calls (contact_id, type, duration) values ('1', 'outgoing', '180')
insert into Calls (contact_id, type, duration) values ('2', 'incoming', '300')
insert into Calls (contact_id, type, duration) values ('2', 'outgoing', '240')
insert into Calls (contact_id, type, duration) values ('3', 'incoming', '150')
insert into Calls (contact_id, type, duration) values ('3', 'outgoing', '360')
insert into Calls (contact_id, type, duration) values ('4', 'incoming', '420')
insert into Calls (contact_id, type, duration) values ('4', 'outgoing', '200')
insert into Calls (contact_id, type, duration) values ('5', 'incoming', '180')
insert into Calls (contact_id, type, duration) values ('5', 'outgoing', '280')

一     我们使用左连接,连接两者然后选取需要的字段,再加上一个排名窗口函数方便后续的筛选。

select  first_name,
        type,
        duration,
        rank() over (partition by type order by duration desc) as rn
from calls c
left join contacts t on c.contact_id = t.id

输出如下

二    使用 cte 然后选取需要的字段,对时间进行转换,最后再把时间格式给转换下,不然力扣报错。然后按照要求对字段进行倒序排序,但是题目给出的结果和这个矛盾,有点问题哦,答案是倒序,这个我实验了,大家就别管题目了。

with tmp as
(select first_name,
        type,
        duration,
        rank() over (partition by type order by duration desc) as rn
from calls c
left join contacts t on c.contact_id = t.id)
select  first_name,
        type,
        cast(sec_to_time(duration) as char) as duration_formatted
from tmp where rn <= 3
order by type ,duration desc,first_name desc;

输出如下

以上就是全部答案,如果对你有帮助请点个赞,谢谢。

来源:力扣(leecode

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 转载请注明出处:

3124. 查找最长的电话-优快云博客编写一个解决方案来找到 三个最长的呼入 和 呼出 电话。返回结果表,以 , 和 降序排序 , 的格式必须为 HH:MM:SS。结果格式如下所示。以上就是全部答案,如果对你有帮助请点个赞,谢谢。来源:力扣(leecode)著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 转载请注明出处:我会尽快把力扣上的所有数据库题目发出来。感兴趣的可以点个赞与关注。每天不定时跟新。https://blog.youkuaiyun.com/CYJ1844/article/details/144078170?

我会尽快把力扣上的所有数据库题目发出来。感兴趣的可以点个赞与关注。每天不定时跟新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值