我有这些记录:
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?
答案 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总是会为每一行提供唯一的排名。