如何按日期获取表中的最新记录

时间:2018-03-28 14:37:03

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

    ID       eff_date                   term_date
-----------------------------------------------------
1   100     2013-01-01    0
2   100     2013-11-27    2017-12-31
3   101     2014-01-01    2018-12-31 
4   101     2013-11-27    2013-12-31

所以这里有两种情况。一种是基于term_date以及第一行和第二行放置最新记录,相同的id但第二行终止但第一行不是。在那种情况下,我想拉不终止行。我知道如何根据日期提取最新的记录,但我不确定如何将记录拉到零。 非常感谢你。

1 个答案:

答案 0 :(得分:1)

这就是我理解这个问题的方式(在我看来,这个问题就像泥巴一样清晰)。

首先,将(明显的)日期值存储到VARCHAR2列中是一个坏主意。将零置入其中(而不是明显缺乏价值)也是错误的。

无论如何,这就是你拥有的。将任何值(表示日期)与零进行比较时,它总是大于0,因此您可以自由地使用它。唯一的好处是那些“日期”以yyyy-mm-dd格式存储,这种排序更简单。

所以,这是:

SQL> with test (id, eff_date, term_date) as
  2    (select 100, '2013-01-01', '0'          from dual union
  3     select 100, '2013-11-27', '2017-12-31' from dual union
  4     select 101, '2014-01-01', '2018-12-31' from dual union
  5     select 101, '2013-11-27', '2013-12-31' from dual
  6    ),
  7  inter as
  8    (select id, eff_date, term_date,
  9       rank() over (partition by id order by term_date desc) rnk
 10     from test
 11    )
 12  select id, eff_date, term_date
 13  from inter
 14  where rnk = 1;

        ID EFF_DATE   TERM_DATE
---------- ---------- ----------
       100 2013-11-27 2017-12-31
       101 2014-01-01 2018-12-31

SQL>