【问题标题】:How can I select only newest entries?我怎样才能只选择最新的条目?
【发布时间】:2015-03-30 08:36:35
【问题描述】:

我有这样的表:

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 | ...
...

我需要选择所有 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。

我该怎么做?谢谢。

【问题讨论】:

    标签: sql oracle greatest-n-per-group


    【解决方案1】:

    这是一个典型的场景,其中分析函数(又名窗口函数)非常有用:

    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 删除除每个组的最新条目之外的所有内容

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

      • 谢谢。 Getting error ORA-00906: missing left parenthesis.
      • 您是否将table 替换为您的实际表名?
      • 抱歉。忘记更换第二个“表”。它对我有用,但我有相同的条目,它也显示相同的最后条目。我怎样才能为此使用 distinct?
      • distinct放在第一个select之后。
      • @Ric 您不能将DISTINCTGROUP BY 与CLOB 列一起使用。
      【解决方案3】:

      使用NOT EXISTS 查找表中没有更新行的ist:

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

      【讨论】:

        猜你喜欢
        • 2016-04-04
        • 2023-01-19
        • 1970-01-01
        • 2020-07-18
        • 2019-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多