我有一个包含创建日期列的表。无论如何选择在没有内部查询和连接的一个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
答案 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;
注意:如果其中一个日期与传入日期匹配,则结果不确定(在三个可能日期中)。