Sql 为每个用户选择最大记录
这似乎应该是相当简单的,但我在试图找到一个适合我的解决方案时遇到了障碍 我有一个member_contracts表,其结构如下(简化)Sql 为每个用户选择最大记录,sql,sql-server,subquery,Sql,Sql Server,Subquery,这似乎应该是相当简单的,但我在试图找到一个适合我的解决方案时遇到了障碍 我有一个member_contracts表,其结构如下(简化) MemberID | ContractID | StartDate | End Date | ------------------------------------------------ 1 1 2/1/2002 2/1/2003 2 2 3/1/2002
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
在每个用户的基础上执行此操作非常简单,因为我可以使用一个子查询为指定用户选择最大收缩。我使用的是SQL server,所以如果有一种特殊的方式可以使用这种风格,我愿意使用它。就我个人而言,我想要一些引擎不可知论的东西
但是,我该如何编写一个查询来实现所有用户的目标呢
编辑:我还应该补充一点,我寻找的是每个用户的最大收缩值,而不是最近的日期 此解决方案使用压缩字段的唯一性:
SELECT MemberID, ContractID, StartDate, EndDate
FROM member_contracts
WHERE ContractId IN (
SELECT MAX(ContractId)
FROM member_contracts
GROUP BY MemberId
)
在线查看它的工作情况:最安全的方法是使用
行号
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
这将处理同一成员的多个合同的情况。这可能不是数据中的一个问题。您的日期列是date类型还是varchar类型?它们是date类型,但实际上,只有合同ID的最高值才是重要的。合同ID保证是唯一的吗?很好,我在写一个答案时使用了
行号
,但这更简单,可以在2005年以前的SQL Server版本上运行,并且运行良好。非常感谢。有些事情告诉我,我将来会使用这个。太棒了,这似乎是比依赖合同ID唯一更通用的案例解决方案。你介意详细说明一下你的问题在这里做什么吗?在我的例子中,我想选择最新的记录(如标题所示);我把它放在一个盒子里,以展示最近的行为。