2011-08-09 2 views
3

나는 그렇게 단순한 것처럼 보이지만 구문을 이해할 수 없습니다. 나는 요금이 바뀐 날짜와 관련된 지불 비율 테이블과 직원 ID를 가지고있다. 직원 당 여러 기록.테이블에서 가장 최근의 임금 인상을 시도 중

나는 가장 최근 날짜와 그 날짜의 임금 목록을 얻으려고합니다. 나는 시도했다 : SELECT MAX (날짜), 비율, EmpID FROM 기록

그러나 작동하지 않는다. 그것은 각 지불 비율에 대한 기록을 반환하는 것 같습니다.

다른 사람들이 어떻게 효율적으로이를 수행 할 수 있습니까?

답변

5

이렇게하면 각 EmpID에 대한 Rate 최신을 제공 할 것입니다. 나는 많은 직원들이 같은 날짜를 공유 할 수 있기 때문에이 작품, 생각하지 않으며, 한 사람의 가장 최근의 날짜는 anothers의하지 않을 수 있습니다 - http://data.stackexchange.com/stackoverflow/q/109020/

+0

일반적으로 ROW_NUMBER()는 상관 집계 된 하위 쿼리보다 성능이 뛰어납니다. –

+0

잘 작동합니다. 고맙습니다. 전에 ROW_NUMBER()를 사용한 적이 없습니다. 좋은 교훈은 "나를 해치지 않을지 모르지만 (더 어렵게 만들 것입니다") – beauk

+1

내가 말해야 할 점은 하위 쿼리에서 MAX (날짜)와 함께 작동하도록 할 수 있었지만 엉망이 될만한 가치가 없다. ROW_NUMBER()를 사용하면 훨씬 좋습니다. 또한 나를 던지고 있던 부분은 날짜 필드가 varchar이므로이 솔루션이나 MAX() 하위 쿼리가 예상대로 작동하지 않았습니다. 일단 나는 그것을 잡았고 CAST ([날짜]를 datetime으로), 그것은 효과가 있었다. 게시하기 전에 해당 데이터 유형을 확인했다고 생각했지만 중복 확인을해야합니다. 내가 말했듯이, 미카엘 에릭슨의 제안은 훨씬 낫다. – beauk

2
SELECT Date, Rate, EmpID 
FROM History A 
WHERE Date = (
      SELECT Max(Date) 
      FROM History B 
      WHERE A.EmpID = B.EmpId) 
+0

@JoeStefanelli :

select [Date], Rate, EmpID from (select [Date], Rate, EmpID, row_number() over(partition by EmpID order by [Date] desc) as rn from History) as H where rn = 1 

여기보십시오. 또는 나는 무엇인가 놓치고 있냐? – beauk

+0

@AncientAnt : 이것은 내 대답이 아닙니다. 코드를 포맷하기 위해서만 편집했습니다. 가치가있는 것을 위해 나는 Mikael Eriksson의 답변을 더 나은 선택으로 기권했다. –

+0

@JoeStfanelli : 저의 실수. 도와 주셔서 감사합니다! – beauk

0
select * 
from payrates 
where date = (select max(dates) 
       from payrates); 
관련 문제