Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每个用户选择最大记录_Sql_Sql Server_Subquery - Fatal编程技术网

Sql 为每个用户选择最大记录

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

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

我有一个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
在每个用户的基础上执行此操作非常简单,因为我可以使用一个子查询为指定用户选择最大收缩。我使用的是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唯一更通用的案例解决方案。你介意详细说明一下你的问题在这里做什么吗?在我的例子中,我想选择最新的记录(如标题所示);我把它放在一个盒子里,以展示最近的行为。