力扣题目跳转(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 的信息。
题目要求:
编写一个解决方案来找到 三个最长的呼入 和 呼出 电话。
返回结果表,以 type
,duration
和 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)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
转载请注明出处:
我会尽快把力扣上的所有数据库题目发出来。感兴趣的可以点个赞与关注。每天不定时跟新。