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但第二行终止但第一行不是。在那种情况下,我想拉不终止行。我知道如何根据日期提取最新的记录,但我不确定如何将记录拉到零。 非常感谢你。
答案 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>