排名/查找日期

时间:2017-03-28 14:50:09

标签: oracle date rank

我有这些记录:

PHOT    1/16/2017   20170118    0.01
PHOT    1/16/2017   20170117    0.0103
PHOT    1/16/2017   20170116    0.0101
PHOT    1/16/2017   20170115    0.0101
PHOT    1/16/2017   20170114    0.0105
.
.
.
MSRT    12/31/2016  20170327    0.855
MSRT    12/31/2016  20170324    0.87
MSRT    12/31/2016  20170323    0.87
MSRT    12/31/2016  20170322    0.88
MSRT    12/31/2016  20170321    0.89
.
.
.

基本上我需要第3列中最接近日期的记录,即< =第2列中的日期。

它应该按列1分区。我只需要1条记录,即具有关闭列2日期到第1列日期的记录。

这可以通过一些DENSE_RANK完成吗?或者我应该使用ROW_NUMBER?

1 个答案:

答案 0 :(得分:0)

以下查询应该有所帮助:

 Select * from (
 select row_number() over (partition by t.col1 order by      
 abs(t.col2-to_date(t.col3, 'yyyymmdd'))) rw, t.*
 From tbl t where t.col2 >= to_date(t.col3, 'yyyymmdd')) where rw = 1;

说明:

内部查询使用col3上的to_date函数将日期格式化为与col2相同的模式。

然后我们可以将它与where子句中的col2进行比较。接下来,我们为每个col1排序这两列之间的绝对空间(再次使用to_date)(按col1分区,按abs排序)。

最后,我们取每个col1组的最上一行(rw = 1)。

请注意,如果您使用的是dense_ranke,它可以为每个col1创建多个行,因为如果您有2行具有相同的绝对值 - 则dense_ranke会将它们排在相同的数字(让我们说-1) ,然后你可以为每列获得几行。 Row_number总是会为每一行提供唯一的排名。