T-SQL:根据表之前的结果查找结果

时间:2015-11-02 17:25:54

标签: sql sql-server

我不确定我是否正确地填写了这个问题标题,因为我还不熟悉SQL,但这是我能想到的最好的...

所以我有两个表,一个是Policy表和一个Claims表。 在政策表中,我有以下相关字段: [Policy_NO],[Creation_Date],[Limit],[Limit_Date]。现在每个策略都有多个限制,因此您可能会得到类似下表的内容:

+-----------+---------------+-------+------------+  
| Policy_NO | Creation_Date | Limit | Limit_Date |  
+-----------+---------------+-------+------------+  
| A00001    | 8/31/2015     |  1000 | 8/31/2015  |  
| A00001    | 8/31/2015     |  2000 | 9/30/2015  |  
| A00001    | 8/31/2015     |  5000 | 10/22/2015 |  
| A00001    | 8/31/2015     |   500 | 11/17/2015 |  
| A00003    | 9/21/2015     |  3000 | 1/1/2016   |  
+-----------+---------------+-------+------------+

索赔表包含以下相关字段:[Policy_NO],[Claim_NO]和[Claim_Date]

+-----------+----------+------------+
| Policy_NO | Claim_NO | Claim_Date |
+-----------+----------+------------+
| A00001    | CL00001  | 11/16/2015 |
| A00003    | CL00002  | 2/2/2016   |
+-----------+----------+------------+

因此,根据上面的示例,您应该将此解释为,政策是在2015年8月31日创建的,并且保单持有人要求在2015年9月30日和2015年10月22日限制增加。 2015年11月16日,索赔进入,并且限制从2015年11月17日的5000降至500。

我想创建一个查询(我只有读访问权限btw),这将给我一个与正确限制相关联的组合列表,一个简单的右/左连接将无法做到。

因此,根据上面的示例,我的表中有关策略A00001的结果应如下所示:

+-----------+---------------+-------+---------------+----------+------------+
| Policy_NO | Creation_Date | Limit |  Limit_Date   | Claim_NO | Claim_Date |
+-----------+---------------+-------+---------------+----------+------------+
| A00001    | 8/31/2015     |  1000 | 8/31/2015     |          |            |
| A00001    | 8/31/2015     |  2000 | 9/30/2015     |          |            |
| A00001    | 8/31/2015     |  5000 | 10/22/2015    | CL00001  | 11/16/2015 |
| A00001    | 8/31/2015     |   500 | 11/17/2015    |          |            |
+-----------+---------------+-------+---------------+----------+------------+

基本上,我希望能够轻松地将声明与正确的限制日期相关联。我已经考虑过将WHERE设置为Claims_Date> = Limit_Date,但这只能解决部分问题。索赔后,限额很可能会下降,但可能会在未来几个月内上涨;并且我当前的代码会多次显示此声明,但不同的限制是不正确的。底线 - 声明只会与策略关联一次,所以我希望可以使用一些迭代过程。

非常感谢任何帮助/建议!

2 个答案:

答案 0 :(得分:0)

对于每项声明,您都可以使用outer apply获取政策行:

select c.*, p.*
from claims c outer apply
     (select top 1 p.*
      from policies p
      where p.policy_no = c.policy_no and p.limit_date <= c.claim_date
      order by p.limit_date desc
     ) p;

答案 1 :(得分:0)

A&#34;正常&#34;使用Policy_NO作为JOIN-Field在两个表之间进行联接应该按照您的要求进行:

SELECT p.Policy_NO, p.Creation_Date, p.Limit, p.Limit_date, c.Claim_NO, Claim_Date
FROM policy AS p, claims AS c
WHERE c.Policy_NO = p.Policy_NO
ORDER BY c.claim_NO, p.Limit_Date ASC