1

異なる方法で保存されている2セットの時系列データをマージしようとしているという見方があります。セットDには、すべての時点で保存された単一の値があります。セットRには、発効日のみで保存される値があり、それらは置き換えられるまで有効です。テーブル構造の例を次に示します。

Table D
---------+------------------+--------
D_series | D_time           | D_value
---------+------------------+--------
1        | 2012-01-01 00:00 | 4.52
1        | 2012-01-01 01:00 | 2.41
1        | 2012-01-01 02:00 | 5.98
1        | 2012-01-01 03:00 | 3.51
2        | 2012-01-01 00:00 | 4.54
2        | 2012-01-01 01:00 | 6.41
2        | 2012-01-01 02:00 | 5.28
2        | 2012-01-01 03:00 | 3.11
3        | 2012-01-01 00:00 | 4.22
3        | 2012-01-01 01:00 | 9.41
3        | 2012-01-01 02:00 | 3.98
3        | 2012-01-01 03:00 | 3.53

Table L
---------+---------
D_series | R_series
---------+---------
1        | 1
2        | 1
3        | 2

Table RV
---------+----------+--------
R_series | R_header | R_value
---------+----------+--------
1        | 1        | 5.23
1        | 2        | 2.98
2        | 1        | 1.35

Table RH
---------+-----------------
R_header | R_start
---------+-----------------
1        | 2012-01-01 00:00
2        | 2012-01-01 01:49
3        | 2012-01-01 02:10

ビューに、対応する現在のすべてのポイントとD_time一緒にすべてのポイントを返すようにします。D_valueR_value

---------+------------------+---------+--------
D_series | D_time           | D_value | R_value
---------+------------------+---------+--------
1        | 2012-01-01 00:00 | 4.52    | 5.23
1        | 2012-01-01 01:00 | 2.41    | 5.23
1        | 2012-01-01 02:00 | 5.98    | 2.98
1        | 2012-01-01 03:00 | 3.51    | 2.98
2        | 2012-01-01 00:00 | 4.54    | 5.23
2        | 2012-01-01 01:00 | 6.41    | 5.23
2        | 2012-01-01 02:00 | 5.28    | 2.98
2        | 2012-01-01 03:00 | 3.11    | 2.98
3        | 2012-01-01 00:00 | 4.22    | 1.35
3        | 2012-01-01 01:00 | 9.41    | 1.35
3        | 2012-01-01 02:00 | 3.98    | 1.35
3        | 2012-01-01 03:00 | 3.53    | 1.35

サブクエリを作成してそれに参加すれば、これを実行できることを知っています。

select D.D_series, D_time, D_value, RV1.R_value
from D
join L on L.D_series = D.D_series
join RV RV1 on RV1.R_series = L.R_series
join RH RH1 on RH1.R_header = RV1.R_header and RH1.R_start <= D.D_time
left join (
    select R_series, R_value, R_start
    from RV RV2
    join RH RH2 on RH2.R_header = RV2.R_header
) RZ on RZ.R_series = RV1.R_series and RZ.R_start > RH1.R_start
where RZ.R_start is null or RZ.R_start > D_time

しかし、私が理解しているように、このサブクエリは、ビューに数個しか含まれていない場合でも、最初にすべてレコードをフェッチします。このサブクエリを削除して標準の結合にする方法はありますか?RVRHR_series

4

1 に答える 1

0

クロスアプライの使用について考えたことはありますか?「単純な結合条件がない」状況に適しています。

この回答を参照してください:内部結合よりもクロス適用を使用する必要があるのはいつですか?

あなたの場合、これらの行に沿った何かがうまくいくと思います:

select D.D_series, D_time, D_value, current_r_values.R_value
from D
join L on L.D_series = D.D_series
cross apply (
   select top 1 R_series, R_value, R_start
   from RV RV2
   join RH RH2 on RH2.R_header = RV2.R_header
   where RH2.R_Start<D.D_time
   and RV2.R_series = L.R_series
   order by R.R_Start DESC) current_r_values

私はそれがあなたが探していたものではないことを知っていますが、クロス適用を使用すると、不等式に結合するよりも大幅に高速になることがよくあります。

于 2013-03-08T18:23:27.897 に答える