如何用SQL计算客户的OriginalEffectiveDate(含保障中断判断)
问题描述
数据表结构
存储客户及保单信息的大型数据表(实际日期分布于全年)结构如下:
| Record | CustomerID | Name | PolicyStart | PolicyEnd | Agent | Status |
|---|---|---|---|---|---|---|
| 1 | 12345 | Jane Doe | 20060101 | 20081231 | John Smith | Term |
| 2 | 12345 | Jane Doe | 20090101 | 20101231 | Sarah Po | Term |
| 3 | 12345 | Jane Doe | 20110101 | Sarah Po | Active | |
| 4 | 12346 | Joe Dirt | 20130101 | 20141231 | Blake Lee | Term |
| 5 | 12346 | Joe Dirt | 20200101 | Blake Lee | Active |
原查询语句及结果
原本用于获取所有活跃账户的SQL语句:
SELECT * FROM Customers WHERE Status = 'Active'
查询结果:
| Record | CustomerID | Name | PolicyStart | PolicyEnd | Agent | Status |
|---|---|---|---|---|---|---|
| 3 | 12345 | Jane Doe | 20110101 | Sarah Po | Active | |
| 5 | 12346 | Joe Dirt | 20200101 | Blake Lee | Active |
目标结果格式
需要生成的最终结果格式:
| Record | CustomerID | Name | OriginalEffectiveDate | Agent | Status |
|---|---|---|---|---|---|
| 3 | 12345 | Jane Doe | 20060101 | Sarah Po | Active |
| 5 | 12346 | Joe Dirt | 20200101 | Blake Lee | Active |
具体计算规则
计算OriginalEffectiveDate列的核心规则:
- 若客户的保障无1个月及以上的中断,将最早的
PolicyStart作为OriginalEffectiveDate; - 若存在中断(或多次中断),取最近一次中断后的首个保单生效日作为
OriginalEffectiveDate。
示例说明:
- Jane Doe的保障从未中断,因此
OriginalEffectiveDate为20060101; - Joe Dirt的保障存在1个月以上的中断,最近一次中断后的首个生效日为20200101,因此取该日期。
当前难点与需求
尝试使用CASE、MIN、MAX、TOP语句均未成功,核心困境在于:
- 如何判断保单间是否存在“1个月及以上的中断”;
- 如何定位“最近一次中断后的首个日期”。
曾在线搜索解决方案但未找到类似案例,推测是搜索关键词不当。希望获得方法指引(而非直接代码),掌握解决这类问题的思路。
内容的提问来源于stack exchange,提问作者user2597747
相关产品推荐
相关产品推荐

