39

这似乎应该相当简单,但我在试图找到一个适合我的解决方案时遇到了困难。

我有一个 member_contracts 表,它具有以下(简化的)结构。

MemberID | ContractID   | StartDate | End Date |
------------------------------------------------
1          1              2/1/2002    2/1/2003
2          2              3/1/2002    3/1/2003
3          3              4/1/2002    4/1/2003
1          4              2/1/2002    2/1/2004
2          5              3/1/2003    2/1/2004
3          6              4/1/2003    2/1/2004

我正在尝试创建一个查询,该查询将从该表中选择最新的合同。这是这个小例子的以下输出:

MemberID | ContractID   | StartDate | End Date |
------------------------------------------------
1          4              2/1/2002    2/1/2004
2          5              3/1/2003    2/1/2004
3          6              4/1/2003    2/1/2004

在每个用户的基础上执行此操作非常简单,因为我可以使用子查询来选择指定用户的最大 contractID。我正在使用 SQL Server,所以如果有一种特殊的方式可以使用这种方式,我愿意使用它。就个人而言,我想要与引擎无关的东西。

但是,我将如何编写一个可以为所有用户实现目标的查询?

编辑:我还应该补充一点,我正在寻找每个用户的最大 contractID 值,而不是最近的日期。

4

2 回答 2

49

此解决方案使用 ContractId 字段的唯一性:

SELECT MemberID, ContractID, StartDate, EndDate
FROM member_contracts 
WHERE ContractId IN (
    SELECT MAX(ContractId)
    FROM member_contracts 
    GROUP BY MemberId
)

在线查看它:sqlfiddle

于 2012-08-30T18:53:55.910 回答
21

最安全的方法是使用row_number

select MemberId, ContractId, StartDate, EndDate
from (select mc.*,
             row_number() over (partition by MemberId order by contractId desc) seqnum
      from Member_Contracts mc
     ) mc
where seqnum = 1

这可以处理同一成员的多个合同的情况。. . 在这个数据中这可能不是一个真正的问题。

于 2012-08-30T18:57:42.807 回答