力扣题
1、题目地址
1699. 两人之间的通话次数
2、模拟表
表:Calls
Column Name | Type |
---|---|
from_id | int |
to_id | int |
duration | int |
- 该表没有主键(具有唯一值的列),它可能包含重复项。
- 该表包含 from_id 与 to_id 间的一次电话的时长。
- from_id != to_id
3、要求
编写解决方案,统计每一对用户 (person1, person2) 之间的通话次数和通话总时长,其中 person1 < person2 。
以 任意顺序 返回结果表。
返回结果格式如下示例所示。
示例 1:
输入:
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 |
解释:
用户 1 和 2 打过 2 次电话,总时长为 70 (59 + 11)。
用户 1 和 3 打过 1 次电话,总时长为 20。
用户 3 和 4 打过 4 次电话,总时长为 999 (100 + 200 + 200 + 499)。
4、代码编写
分组使用原代码(非别名)
SELECT IF(from_id < to_id, from_id, to_id) AS person1, IF(to_id > from_id, to_id, from_id) AS person2,COUNT(*) AS call_count, SUM(duration) AS total_duration
FROM Calls
GROUP BY IF(from_id < to_id, from_id, to_id), IF(to_id > from_id, to_id, from_id)
分组使用别名
SELECT IF(from_id < to_id, from_id, to_id) AS person1, IF(to_id > from_id, to_id, from_id) AS person2,COUNT(*) AS call_count, SUM(duration) AS total_duration
FROM Calls
GROUP BY person1, person2
分组使用数字(对应原代码查询位置,1开始递增)
SELECT IF(from_id < to_id, from_id, to_id) AS person1, IF(to_id > from_id, to_id, from_id) AS person2,COUNT(*) AS call_count, SUM(duration) AS total_duration
FROM Calls
GROUP BY 1, 2
SELECT COUNT(*) AS call_count, SUM(duration) AS total_duration,IF(from_id < to_id, from_id, to_id) AS person1, IF(to_id > from_id, to_id, from_id) AS person2
FROM Calls
GROUP BY 3, 4