还是得按照题目意思来,很容易理解错
t1的作用是将caller和recipient正反取一下然后union,因为题目要求不用考虑拨打者或接收者
之后只需查询每个人每天第1个电话和最后1个电话打给谁
使用rank正序倒序排一下,取排名为1的行即可
WITH t1 as(
select *,date(call_time) call_date from Calls
union all
select recipient_id,caller_id,call_time,date(call_time) from Calls)
select distinct a.caller_id user_id from
(select caller_id,recipient_id,call_date from(
select *,rank() over(partition by caller_id,call_date order by call_time) rk
from t1) temp where rk = 1) a
inner join
(select caller_id,recipient_id,call_date from(
select *,rank() over(partition by caller_id,call_date order by call_time desc) rk
from t1) temp where rk = 1) b
where (a.caller_id,a.recipient_id,a.call_date) = (b.caller_id,b.recipient_id,b.call_date)