Sql server 列出具有最近日期的行

Sql server 列出具有最近日期的行,sql-server,tsql,Sql Server,Tsql,我有一张列出合同日期的表格。一份合同可以有多个日期,所以我只想要最近的一个 我尝试按contractEnded日期进行排名,然后进行筛选,以便只获得第一个排名,但我一直得到一个语法错误: 列名称“contractRank”无效 在mssql 2012中是否有这样做的方法 谢谢 排名函数在使用它们的查询中不可操作,您需要使用外部查询来操作任何排名函数 另外,在使用排名函数时,您不需要使用MAX函数来获取最后日期,下面的查询将返回表中每个用户ID的最后合同结束日期 SELECT contractEn

我有一张列出合同日期的表格。一份合同可以有多个日期,所以我只想要最近的一个

我尝试按contractEnded日期进行排名,然后进行筛选,以便只获得第一个排名,但我一直得到一个语法错误:

列名称“contractRank”无效

在mssql 2012中是否有这样做的方法


谢谢

排名函数在使用它们的查询中不可操作,您需要使用外部查询来操作任何排名函数

另外,在使用排名函数时,您不需要使用MAX函数来获取最后日期,下面的查询将返回表中每个用户ID的最后合同结束日期

SELECT contractEnded, contractID, contractStarted, contractEnded, userID, examID
FROM (
     SELECT contractEnded, contractID, contractStarted, contractEnded, userID, examID,
         ROW_NUMBER() OVER (partition by userID ORDER BY contractEnded desc)  AS contractRank
     FROM examcontract 
    WHERE examID = 92855231134
     )A
WHERE  A.contractRank = 1
正如Aaron在评论部分中提到的,您还可以使用CTE公共表表达式来实现相同的结果

;WITH CTE AS 
 (
  SELECT contractEnded, contractID, contractStarted, contractEnded, userID, examID,
    ROW_NUMBER() OVER (partition by userID ORDER BY contractEnded desc)  AS contractRank
  FROM examcontract es
  WHERE examID = 92855231134
 )
SELECT contractEnded, contractID, contractStarted, contractEnded, userID, examID
FROM CTE 
WHERE contractRank = 1

不能使用WHERE、ON、GROUP BY等中select子句中的别名。请使用CTE。选择x作为最大值。。。从x中选择*,其中contractRank=1;
;WITH CTE AS 
 (
  SELECT contractEnded, contractID, contractStarted, contractEnded, userID, examID,
    ROW_NUMBER() OVER (partition by userID ORDER BY contractEnded desc)  AS contractRank
  FROM examcontract es
  WHERE examID = 92855231134
 )
SELECT contractEnded, contractID, contractStarted, contractEnded, userID, examID
FROM CTE 
WHERE contractRank = 1