如果您想在前后获得 50 行,也许这会满足您的要求:
with cte1 as (
select top 50 t.*
from table t
where CalculatedDate <= getdate()
order by CalculatedDate desc
),
cte2 as (
select top 50 t.*
from table t
where CalculatedDate > getdate()
order by CalculatedDate
)
select *
from (select * from cte1 union all select * from cte2) t
编辑:
从问题的上下文中我不清楚是否真的需要行号。虽然很容易添加:
(select top 50 t.*,
- row_number() over (order by CalculatedDate desc) as rownumber
from table t
where CalculatedDate <= getdate()
order by CalculatedDate desc
)
union all
(select top 50 t.*,
row_number() over (order by CalculatedDate) as rownumber
from table t
where CalculatedDate > getdate()
order by CalculatedDate
)
您实际上可以将它们组合成一个查询:
select t.*,
((case when CalculatedDate < getdate() then -1 else 1 end) *
(row_number() over (partition by (case when CalculatedDate < getdate() then 1 else 0 end)
order by (case when CalculatedDate < getdate() then CalculatedDate end) desc,
CalculatedDate asc
)
)) as rn
from table t;
您可以将其放在子查询中并选择rn
-50 到 50 之间的位置。
但是,我不确定如何处理第 0 行,并且该问题没有提供有关如何处理任何匹配的记录的信息getdate()
(尽管不太可能)。我认为第一个答案可以满足 OP 的需要。