2016-08-24 1 views
0

나는 다음과 같습니다. DriverID "134"에 세 개의 레코드가 있습니다. 두 번째 마지막 데이터를 원합니다.이 사람은 어떻게 도와야합니까? 두 번째 마지막 데이터를 얻으려면 주십시오. 내가 얼마나 더 일 driverid 다음 두 번째 마지막 레코드 종류마다 내 테이블에서 데이터를 fatch하는 enter image description heredriverid에서 두 번째 마지막 레코드를 얻는 방법 SQL 서버

답변

2

사용 Row_Number() 창 기능

With cte as 
(
select *,Row_Number()over(order by Transdate desc) as Rn from yourtable 
Where DriverID = 134 
) 
Select * 
from cte 
Where Rn = 2 

다음이를 사용 DriverID를 제공하기위한 하나 개의 레코드 만있을 때 처리하는 방법

With cte as 
(
select *,Row_Number()over(order by Transdate desc) as Rn, 
count(1)over() as cnt from yourtable 
Where DriverID = 134 
) 
Select * 
from cte 
Where (Rn = 2 and cnt > 1) or (Rn = 1 and cnt = 1) 

참고 :이 마지막 두 번째 레코드에 넥타이이며, 당신이 원하는 모두 기록은 대신 DENSE_RANK를 사용하는 경우 ROW_NUMBER

업데이트 :

번째 마지막 레코드를 찾으려면 모두DriverID's에 의해 파티션을 추가하고 Row_numberDriverID을 제거하십시오. Where 조항

With cte as 
(
select *,Row_Number()over(Partition by DriverID order by Transdate desc) as Rn, 
count(1)over(Partition by DriverID) as cnt from yourtable 
) 
Select * 
from cte 
Where (Rn = 2 and cnt > 1) or (Rn = 1 and cnt = 1) 
+0

... +1 그러나 : 당신은 단지 하나 개의 레코드가있는 곳에 <= 2 ... 사례를 잡으려고 사용할 수 있습니다 (물론 실제의 요구에 따라 다름) . – Shnugo

+0

@Shnugo - 예, 맞습니다. 이에 따라 답변이 업데이트되었습니다. 주어진'DriverID'에 대해 두 개 이상의 레코드가있을 때 <= 2를 사용할 수 없기 때문에 –

+0

내 테이블에서 데이터를 처리하는 방법을 알려주십시오. 매초마다 마지막 레코드를 하나씩 찾습니다. driverid –

0
SELECT * FROM (
    SELECT 
ROW_NUMBER() OVER (ORDER BY key DEC) AS rownumber, 
columns 
FROM tablename 
) AS foo 
WHERE rownumber <= 2 
당신은 나보다 더 빨리했다
관련 문제