2014-09-25 70 views
1

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

我试图通过contractEnded日期排序,然后过滤,这样我只得到了第一个排名,但我不断收到一个语法错误:

无效的列名称contractRank“。

SELECT MAX(contractEnded) AS contractEnded, contractID, contractStarted, contractEnded, userID, examID, 
ROW_NUMBER() OVER (
        partition by userID 
        ORDER BY MAX(contractEnded) desc) 
        AS contractRank 
FROM examcontract es 
WHERE examID = 92855231134 
and es.contractRank = 1 
GROUP BY userID, examID, contractID, contractStarted, contractEnded 

有没有办法在MSSQL 2012年做到这一点?

谢谢!

+2

您不能在'WHERE','ON','GROUP BY'等的select子句中使用别名。使用CTE。 'WITH x AS(SELECT MAX ...)SELECT * FROM x WHERE contractRank = 1;' – 2014-09-25 18:52:56

回答

2

排名函数无法在查询中使用,您将需要使用外部查询来操作任何排名函数。

另外,您不需要使用MAX()函数来获取使用Ranking函数的最后日期,下面的查询将返回表中每个用户ID的Last Contract结束日期。

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