前後に 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
)
これらを実際に 1 つのクエリに組み合わせることができます。
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が必要とするものだと思います。