选择每个用户的最大记录

Sco*_*ott 32 sql sql-server subquery

这似乎应该相当简单,但我在寻找一个适合我的解决方案时遇到了绊脚石.

我有一个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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

基于每个用户执行此操作非常简单,因为我可以使用子查询来为指定用户选择max contractID.我正在使用SQL服务器,所以如果有一种特殊的方式来做这种味道,我愿意使用它.就个人而言,我喜欢与引擎无关的东西.

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

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

Mar*_*ers 38

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

SELECT MemberID, ContractID, StartDate, EndDate
FROM member_contracts 
WHERE ContractId IN (
    SELECT MAX(ContractId)
    FROM member_contracts 
    GROUP BY MemberId
)
Run Code Online (Sandbox Code Playgroud)

看到它在线工作:sqlfiddle

  • +1酷sqlfiddle,我不知道这个工具 (6认同)

Gor*_*off 18

最安全的方法是使用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
Run Code Online (Sandbox Code Playgroud)

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

  • 太棒了,这似乎比依赖合同ID独特的更通用的解决方案.您是否有机会详细说明您的查询在这里做了什么?在我的情况下,我想选择最新的记录(如标题所示); 我将它放入[SQLFiddle](http://sqlfiddle.com/#!3/9dbd0/4)以演示最近的行为. (3认同)