2016-08-24 54 views

回答

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'sRow_number中添加分區並從Where子句中刪除DriverID子句

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 - 是的,你是對的。相應地更新了答案。我們不能使用<= 2,因爲它會拉動兩條記錄,當你有超過1條記錄給定'DriverID' –

+0

你能幫我怎麼從我的表中填充數據每秒排序最後一條記錄多一個driverid –

0
SELECT * FROM (
    SELECT 
ROW_NUMBER() OVER (ORDER BY key DEC) AS rownumber, 
columns 
FROM tablename 
) AS foo 
WHERE rownumber <= 2