2012-10-07 42 views
1

我有以下組由選擇返回的數據:選擇行和ID組和排序n個最新的行(按日期)

date   code  
23/01/2012 AA123 
24/01/2012 AA123 
29/01/2012 AA123 
06/07/2012 AA123 
17/02/2012 BB123 
20/02/2012 BB123 
04/06/2012 BB123 

的選擇給出了所有的數據爲每碼(由有序碼)。我只想返回每個代碼最近2個日期的行。要返回的數據如下:

date   code  
23/01/2012 AA123 
24/01/2012 AA123 
17/02/2012 BB123 
20/02/2012 BB123 

我該如何達到預期的效果?我曾嘗試使用

select date, code 
from table 
where x,y,z 
and rownum < 2 
order by code desc; 

但它只返回頂部2行 -

+0

您是否嘗試過使用羣組 – Abubakkar

+2

*最近的*或*最舊的*?你的結果包括*最老的兩個*。 –

回答

6
select 
    date, 
    code 
from 
    (select 
     date, 
     code, 
     dense_rank() over (partition by code order by date) as rank 
    from 
     table 
    where 
     x,y,z) 
where 
    rank <= 2 
order by 
    code desc; 

相反的dense_rank,你也可以使用rankrow_number。他們之間存在細微差別,所以可能比其他人更適合您的需求。

+0

分區由/ dense_rank() - >哪個db? –

+0

Oracle,因爲此問題被標記。 – GolezTrol

+0

我的不好。我沒有看到。 –

0

你可以使用這個也許。我沒有測試。

select date,code from table A where (select Count(*) from table B where A.code=B.code AND A.date > B.date) < 2 
+0

未測試且未讀取規格。 – GolezTrol

+0

我現在測試它。有用。 [鏈接] http://sqlfiddle.com/#!3/6b144/4。我誤解了這個問題。我注意到最近的日期已經被要求。但示例顯示最早的日期。我寫了關於這個例子的查詢。所以@ user1726582只能在查詢中將A.date> B.date更改爲A.date bselvan