选择特定创建日期之前和之后的拖车行

时间:2017-10-23 21:18:00

标签: sql oracle

我有一个包含创建日期列的表。无论如何选择在没有内部查询和连接的一个select语句中在指定日期之前和之后创建日期的精确拖曳行?

Id - date
1 - 1/1/2013
2 - 2/1/2013
3 - 6/1/2013
4 - 9/2/2014

2013年4月1日的结果是:

2 - 2/1/2013
3 - 6/1/2013

1 个答案:

答案 0 :(得分:0)

您可以使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by sign(date - date '2013-04-01')
                                order by abs(date - date '2013-04-01') as seqnum
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

这可能会返回三行 - 如果日期完全匹配。我将此视为一项功能,因为在这种情况下您没有指定要执行的操作。

在Oracle 12C中,您可以执行以下操作:

select t.*
from t
order by row_number() over (partition by sign(date - date '2013-04-01')
                            order by abs(date - date '2013-04-01')
                           )
fetch first 2 rows only;

注意:如果其中一个日期与传入日期匹配,则结果不确定(在三个可能日期中)。