2014-09-25 6 views
1

계약 날짜가 나열된 테이블이 있습니다. 계약에는 여러 날짜가있을 수 있으므로 가장 최근 날짜 만 원할 것입니다. 가장 최근 날짜가있는 행을 나열합니다.

은 내가 contractEnded 날짜에 의해 순위, 다음 나는 단지 1 순위를 얻을 수 있도록 필터링 시도,하지만 난 구문 오류가 계속 :

잘못된 열 이름 '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 (MAX를 선택하십시오.) SELECT * FROM x where where contractRank = 1;' –

답변

2

순위 지정 기능을 사용하는 쿼리에서 조작 할 수 없기 때문에 외부 쿼리를 사용하여 순위 지정 기능을 조작해야합니다.

또한 순위 지정 기능을 사용할 때 마지막 날짜를 얻기 위해 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 

, 당신은 또한 동일한 결과를 달성하기 위해 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 
관련 문제