sql - 呼叫者的第一个和最后一个呼叫是同一个人
问题描述
我有一个电话记录表,其中包含有关呼叫者通话记录的信息。我想找出在某一天第一次和最后一次打电话给同一个人的来电者。
Callerid Recipientid DateCalled
1 2 2019-01-01 09:00:00.000
1 3 2019-01-01 17:00:00.000
1 4 2019-01-01 23:00:00.000
2 5 2019-07-05 09:00:00.000
2 5 2019-07-05 17:00:00.000
2 3 2019-07-05 23:00:00.000
2 5 2019-07-06 17:00:00.000
2 3 2019-08-01 09:00:00.000
2 3 2019-08-01 17:00:00.000
2 4 2019-08-02 09:00:00.000
2 5 2019-08-02 10:00:00.000
2 4 2019-08-02 11:00:00.000
Expected Output
Callerid Recipientid Datecalled
2 5 2019-07-05
2 3 2019-08-01
2 4 2019-08-02
我写了下面的查询,但无法让它返回收件人 ID。对此的任何帮助将不胜感激!
select pl.callerid,cast(pl.datecalled as date) as datecalled
from phonelog pl inner join (select callerid, cast(datecalled as date) as datecalled,
min(datecalled) as firstcall, max(datecalled) as lastcall
from phonelog
group by callerid, cast(datecalled as date)) as x
on pl.callerid = x.callerid and cast(pl.datecalled as date) = x.datecalled
and (pl.datecalled = x.firstcall or pl.datecalled = x.lastcall)
group by pl.callerid, cast(pl.datecalled as date)
having count(distinct recipientid) = 1
解决方案
首先,我的预查询(PQ 别名),我每天为给定的客户获取最短和最长的通话时间,但还必须确保该人在一天内至少有 2 个电话。从那以后,我在给定日期的第一个(MIN)呼叫中重新加入电话记录表。然后,我在同一天为同一个人的 LAST (MAX) 电话再加入一次,并确保第一个电话的接收者与最后一个相同。
我不必加入用于分组的精简“JustDate”列,因为 MIN/MAX 限定了完整的日期/时间。
select
PQ.JustDate,
PQ.CallerID,
pl1.RecipientID
from
( select
callerID,
convert( date, dateCalled ) JustDate,
min( DateCalled ) minDateCall,
max( DateCalled ) maxDateCall
from
PhoneLog pl
group by
callerID,
convert( date, dateCalled )
having
count(*) > 1) PQ
JOIN PhoneLog pl1
on PQ.CallerID = pl1.CallerID
AND PQ.minDateCall = pl1.dateCalled
JOIN PhoneLog pl2
on PQ.CallerID = pl2.CallerID
AND PQ.maxDateCall = pl2.dateCalled
AND pl1.RecipientID = pl2.RecipientID
推荐阅读
- cocoa - 如何在没有动画的情况下滚动RowToVisible
- android - 如何使用 volley 在 android 中解析以“/”开头的 Json?
- java - 在 Java 8 中将 POJO 转换为 Tree 结构,以便在层次结构中表示数据
- r - 在旭日形中定位标签和颜色编码 - R
- android - 如何使用 android 布局中的工具来替换设计器的合并项
- java - 状态栏什么时候隐藏?
- hybrid-mobile-app - 将 www 文件夹从一个项目复制粘贴到另一个项目无法正常工作
- asp.net - 如何将提交的电子邮件发送到电子邮件
- javascript - 如何在 Odoo 10 的 javascript 中读取 QWeb 变量?
- xcode - 将 Jenkins 管道拆分为环境部分和阶段部分作为模板