3124. 查找最长的电话 🔒
题目描述
表: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 降序排序。
解法
方法一:等值连接 + 窗口函数
我们可以使用等值连接将两张表连接起来,然后使用窗口函数 RANK() 计算每个类型的电话的排名。最后,我们只需要筛选出排名前三的电话即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |