r
SQL Server にテーブルがあり、時間ごとに行ごとに、 whereのいくつかの関数のt
最初の行を見つけたいと考えています。t + i
r
abs(f(r, t + i) - f(r, t)) > epsilon
2 つのカーソルでこれを行うことは想像できますが、これは非常に非効率的です。
T-SQL の専門家から何かアドバイスはありますか?
r
SQL Server にテーブルがあり、時間ごとに行ごとに、 whereのいくつかの関数のt
最初の行を見つけたいと考えています。t + i
r
abs(f(r, t + i) - f(r, t)) > epsilon
2 つのカーソルでこれを行うことは想像できますが、これは非常に非効率的です。
T-SQL の専門家から何かアドバイスはありますか?
私は相関サブクエリの大ファンではありません。しかし、この場合は便利なようです。次のコードは、条件に従って、指定された行の後の最初の行の最小の「シーケンス番号」を返します。
with t as (
select t.*, f(r, t) as fval, row_number() over (order by <ordering>) as seqnum
from table t
)
select t.*,
(select min(t2.seqnum)
from t t2
where t2.seqnum > t.seqnum and
abs(t2.fval - t.fval) > <epsilon>
) as next_seqnum
from t
これを機能させるには、とを指定する必要があり<ordering>
ます<epsilon>
。これは、行の順序を知る方法です(t
推測する必要がある場合は、適切な推測になります)。
select a.t, b.t --- and what other columns you need
from tbl a -- implicitly each row of table
cross apply (
select top(1) * -- the first, going upwards along b.t
from tbl b
where a.t < b.t -- look for records with later t than the source row
and <here's your function between a row and b row>
order by b.t asc
) x