我有一个 SQL 测试的代码问题。不用说,这是我以前没有遇到过的一些新概念。
带有 {columns} 的表是:
phones {Name, Phone_Number}
calls {id,caller,callee,duration}
为那些总通话时长大于或等于 10 分钟的客户查找“姓名”。请注意,需要在调用者和被调用者列上对持续时间求和,以获得大于 10 分钟的总持续时间。
条件:仅显示名称列的查询。
会采用什么方法?
我是否需要使用 join 关键字两次然后按名称执行分组,这是否正确?
答案 0 :(得分:1)
不,您需要的是将调用者和被调用者置于同一位置以求和一个人的持续时间。完成后,您可以加入电话表。这是最简单的选择呼叫与另一个选择呼叫选择第一个呼叫者然后被呼叫者的 UNION。见fiddle here。你没有给出完整的表定义,缺少数据类型,所以我不得不做出一些假设。尽管如此,过程还是一样的。
with call_list (id, duration) as
(select caller id, duration
from calls
union all
select callee, duration
from calls
order by id
)
select p.name, p.phone_number, sum(cl.duration)
from call_list cl
join phones p on (p.id = cl.id)
group by p.name, p.phone_number;