image.png
    image.png


    还是得按照题目意思来,很容易理解错
    t1的作用是将caller和recipient正反取一下然后union,因为题目要求不用考虑拨打者或接收者
    之后只需查询每个人每天第1个电话和最后1个电话打给谁
    使用rank正序倒序排一下,取排名为1的行即可

    1. WITH t1 as(
    2. select *,date(call_time) call_date from Calls
    3. union all
    4. select recipient_id,caller_id,call_time,date(call_time) from Calls)
    5. select distinct a.caller_id user_id from
    6. (select caller_id,recipient_id,call_date from(
    7. select *,rank() over(partition by caller_id,call_date order by call_time) rk
    8. from t1) temp where rk = 1) a
    9. inner join
    10. (select caller_id,recipient_id,call_date from(
    11. select *,rank() over(partition by caller_id,call_date order by call_time desc) rk
    12. from t1) temp where rk = 1) b
    13. where (a.caller_id,a.recipient_id,a.call_date) = (b.caller_id,b.recipient_id,b.call_date)