我怎样才能 select 只有最新条目?

How can I select only newest entries?

我有 table 这样的:

IST | FILEDATE  | DATE                | ...
1   | 2013-2014 | 27.03.2015 10:20:47 | ...
2   | 2013-2014 | 27.03.2015 10:20:47 | ...
3   | 2013-2014 | 27.03.2015 10:20:47 | ...
1   | 2013-2014 | 28.03.2015 11:20:47 | ...
2   | 2013-2014 | 28.03.2015 11:20:47 | ...
3   | 2013-2014 | 28.03.2015 11:20:47 | ...
1   | 2014-2015 | 29.03.2015 12:20:47 | ...
2   | 2014-2015 | 29.03.2015 12:20:47 | ...
3   | 2014-2015 | 29.03.2015 12:20:47 | ...
...

我需要 select 所有 IST 的最新(带日期值)条目,如下所示:

IST | FILEDATE  | DATE                | ...
1   | 2014-2015 | 29.03.2015 11:20:47 | ...
2   | 2014-2015 | 29.03.2015 11:20:47 | ...
3   | 2014-2015 | 29.03.2015 11:20:47 | ...

我尝试了 order byrownum=1,但它只适用于单个 IST。

我该怎么做?谢谢。

您可以先对结果进行分组:

select ist, max(date) date
from   table
group
by     ist

然后您可以将该结果与 select 组合以获得所有匹配行:

select master.*
from   table master
join
( select ist, max(date) date
  from   table
  group
  by     ist
) filter
on     master.ist  = filter.ist
and    master.date = filter.date

这是分析函数(又名窗口函数)真正有用的典型场景:

with v_data(ist, filedate, entry_date) as (
  select 1, '2013-2014', to_date('27.03.2015 10:20:47','DD.MM.YYYY hh24:mi:ss') from dual union all 
  select 2, '2013-2014', to_date('27.03.2015 10:20:47','DD.MM.YYYY hh24:mi:ss') from dual union all 
  select 3, '2013-2014', to_date('27.03.2015 10:20:47','DD.MM.YYYY hh24:mi:ss') from dual union all 
  select 1, '2013-2014', to_date('28.03.2015 11:20:47','DD.MM.YYYY hh24:mi:ss') from dual union all 
  select 2, '2013-2014', to_date('28.03.2015 11:20:47','DD.MM.YYYY hh24:mi:ss') from dual union all 
  select 3, '2013-2014', to_date('28.03.2015 11:20:47','DD.MM.YYYY hh24:mi:ss') from dual union all 
  select 1, '2014-2015', to_date('29.03.2015 12:20:47','DD.MM.YYYY hh24:mi:ss') from dual union all 
  select 2, '2014-2015', to_date('29.03.2015 12:20:47','DD.MM.YYYY hh24:mi:ss') from dual union all 
  select 3, '2014-2015', to_date('29.03.2015 12:20:47','DD.MM.YYYY hh24:mi:ss') from dual)
select * from (
  select 
     v1.*, 
     row_number() over (partition by ist order by entry_date desc) as rn
  from v_data v1
) 
where rn=1

这个解决方案

  • 使用ROW_NUMBER 分析函数
  • 计算每组的排序
  • 删除每组除最新条目以外的所有内容 WHERE rn = 1

使用 NOT EXISTS 查找在 table 中没有更新行的列表:

select *
from tablename t1
where not exists (select 1 from tablename t2
                  where t2.ist = t1.ist
                    and t2.date > t1.date)*