比较相同ID的两个最新列

时间:2016-11-22 01:53:03

标签: sql sql-server tsql sql-server-2012

我有一张人员地址表。 Class列会告知您是家(H),邮政(P)还是内部(I)地址。每次有人更新地址时,也会存储日期。

我的公司在由于地址错误而向我们返回通信时使用了内部地址,因此我们将其更新到我们的地址,直到我们获得新的联系方式。

我想知道哪些人将其地址更改为邮寄地址或家庭住址,并在内部地址生效日期后生效。

以下是表格的示例:

| **PersonID**| **Class** | **EffDate** | **Line1**
| 1           | H         | 12/01/2010  | 31 Academy Avenue 
| 1           | H         | 13/09/2010  | 433 Hillcrest Drive 
| 1           | I         | 26/10/2015  | 1 Bond Circle
| 2           | H         | 17/12/2012  | 761 Circle St. 
| 2           | H         | 12/11/2013  | 597 Elm Lane 
| 2           | I         | 1/10/2015   | 1 Bond Circle
| 2           | H         | 6/12/2016   | 8332 Mountainview St. 
| 3           | P         | 27/09/2010  | 8 Bow Ridge Lane 
| 3           | H         | 6/12/2010   | 22 Shady St. 
| 3           | I         | 7/12/2015   | 1 Bond Circle
| 3           | H         | 8/12/2016   | 7423 Rockcrest Ave. 
| 4           | P         | 9/12/2015   | 888 N. Shady Street 
| 4           | I         | 10/12/2016  | 1 Bond Circle

我希望查询只返回:

| **PersonID**| **Class** | **EffDate** | **Line1**
| 2           | H         | 6/12/2016   | 8332 Mountainview St.
| 3           | H         | 8/12/2016   | 7423 Rockcrest Ave. 

有什么想法吗?我正在使用SQL Server 2012。

1 个答案:

答案 0 :(得分:3)

这是一种方法:

select t.*
from t
where t.class in ('H', 'P') and
      t.effdate > (select max(t2.effdate)
                   from t t2
                   where t2.class = 'I' and t2.personId = t.personId
                  );

另一种使用窗口函数的方法:

select t.*
from (select t.*,
              max(case when class = 'I' then date end) over (partition by personid) as max_idate
      from t
     ) t
where t.class in ('H', 'P') and
      t.date > t.maxidate;