SQL计算理赔系统入站出站邮件操作间隔天数问题咨询
理赔系统邮件回复间隔天数计算方案
需求说明
- 统计入站邮件(
ActionType='IE',收件)与后续出站邮件(ActionType='SE',发件)的日期间隔 - 匹配逻辑:连续多封入站邮件后出现出站邮件时,仅将出站邮件与连续入站序列的最后一封入站邮件配对,序列内其余入站邮件不参与计算
- 过滤规则:后续无对应出站邮件的入站记录不返回结果
示例数据
-- 测试样例数据 SELECT 1 AS RowNo , '123456' AS AccountNumber , 'IE' AS ActionType , 'Incoming Email' AS ActionDesc , '2022-05-03 09:19:33.000' AS DateTimeRecevied , '' AS DaysToReply UNION ALL SELECT 2 AS RowNo ,'123456' AS AccountNumber , 'IE' AS ActionType , 'Incoming Email' AS ActionDesc , '2022-05-21 10:07:22.000' AS DateTimeRecevied , '' AS DaysToReply UNION ALL SELECT 3 AS RowNo , '123456' AS AccountNumber , 'SE' AS ActionType , 'Send Email' AS ActionDesc , '2022-05-22 10:13:08.000' AS DateTimeRecevied , '1' AS DaysToReply UNION ALL SELECT 4 AS RowNo , '123456' AS AccountNumber , 'IE' AS ActionType , 'Incoming Email' AS ActionDesc , '2022-06-22 14:01:54.000' AS DateTimeRecevied , '' AS DaysToReply
实现方案
该场景属于SQL经典的Gaps and Islands(间隔与岛屿)问题,通过窗口函数给连续同类型操作分组后关联匹配即可,以下是SQL Server环境下的可运行代码:
WITH ActionWithGroup AS ( SELECT *, -- 操作类型切换时分组ID累加,为连续同类型操作生成唯一分组标识 SUM( CASE WHEN ActionType != LAG(ActionType,1,'') OVER (PARTITION BY AccountNumber ORDER BY DateTimeRecevied) THEN 1 ELSE 0 END ) OVER ( PARTITION BY AccountNumber ORDER BY DateTimeRecevied ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS GroupId FROM ClaimAction -- 替换为你的实际业务表名 ), GroupAgg AS ( SELECT AccountNumber, GroupId, ActionType, MAX(DateTimeRecevied) AS GroupLastActionTime FROM ActionWithGroup GROUP BY AccountNumber, GroupId, ActionType ) SELECT se.AccountNumber, ie.GroupLastActionTime AS LastIncomingEmailTime, se.GroupLastActionTime AS OutgoingEmailTime, DATEDIFF(day, ie.GroupLastActionTime, se.GroupLastActionTime) AS DaysToReply FROM GroupAgg se INNER JOIN GroupAgg ie ON se.AccountNumber = ie.AccountNumber AND se.GroupId = ie.GroupId + 1 AND ie.ActionType = 'IE' WHERE se.ActionType = 'SE'
结果验证
针对上述测试样例,查询返回结果如下:
| AccountNumber | LastIncomingEmailTime | OutgoingEmailTime | DaysToReply |
|---|---|---|---|
| 123456 | 2022-05-21 10:07:22.000 | 2022-05-22 10:13:08.000 | 1 |
结果完全符合规则:
- 2022-05-03的入站邮件属于连续入站序列的非最后一条,不返回
- 2022-05-21的入站邮件是连续入站序列最后一条,和后续2022-05-22的出站邮件匹配,间隔1天
- 2022-06-22的入站邮件后续无出站记录,不返回
内容的提问来源于stack exchange,提问作者user8023823
相关产品推荐
相关产品推荐

