1

rSQL Server にテーブルがあり、時間ごとに行ごとに、 whereのいくつかの関数のt最初の行を見つけたいと考えています。t + irabs(f(r, t + i) - f(r, t)) > epsilon

2 つのカーソルでこれを行うことは想像できますが、これは非常に非効率的です。

T-SQL の専門家から何かアドバイスはありますか?

4

2 に答える 2

1

私は相関サブクエリの大ファンではありません。しかし、この場合は便利なようです。次のコードは、条件に従って、指定された行の後の最初の行の最小の「シーケンス番号」を返します。

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推測する必要がある場合は、適切な推測になります)。

于 2012-09-27T21:50:47.477 に答える
1
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
于 2012-09-27T21:53:39.917 に答える