选择行和按ID分组并排序n个最新行(按日期)

时间:2012-10-07 11:33:45

标签: sql oracle group-by aggregation top-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

select为每个代码提供所有数据(按代码排序)。我只想为每个代码返回最近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行 -

2 个答案:

答案 0 :(得分: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_rankrank代替row_number,而不是{{1}}。它们之间存在细微差别,因此可能比另一种更适合您的需求。

答案 1 :(得分:0)

你可以使用这个。我没有测试。

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