2017-06-27 9 views
0

間のマッピングを作成し、以下のデータを返す2つのクエリ:私が持っている二つのテーブル

結果1:

2017-02-27 10:54:30.000 
2017-02-27 10:55:30.000 
2017-02-27 10:59:30.000 
2017-02-27 11:02:30.000 

結果2:2番目の結果における行の

2017-02-27 10:52:42.000 2017-02-27 10:55:00.000 
2017-02-27 10:55:05.000 2017-02-27 10:55:43.000 
2017-02-27 10:57:30.000 2017-02-27 11:00:12.000 
2017-02-27 11:01:55.000 2017-02-27 11:02:57.000 

考えます時間間隔として設定し、最初の列 'start'と2番目の列 'end'を呼び出します。私が必要とするのは、ある種のマッピングを作成し、2番目の結果セットの行が最初のセットに「一致」していない行がいくつあるかを調べることです。その意味は...

ここでは例を示します。2番目のテーブルの最初の行R1を見てください。

最初のテーブルに値が開始値と終了値の間になるような行がない場合、行R1を返します。出力は、そのようなすべての行の数である必要があります。

ありがとうございました!

答えて

2

ここでのアプローチの1つは、区間を含む表を最初の表に結合することです。その後、第1のテーブルのタイムスタンプがない区間の間にあるすべてのレコードを第2のテーブルから数えます。

SELECT COUNT(*) 
FROM Result2 r2 
LEFT JOIN Result1 r1 
    ON r1.dt BETWEEN r2.interval1 AND r2.interval2 
WHERE r1.dt IS NULL 
+0

あなたの答えを下記のものと比較すると、パフォーマンスに違いはありますか?ありがとう! –

+0

タフな呼び出し...もう1つの答えは少し速いかもしれませんが、間隔列にインデックスがある場合はどちらもかなり高速になるはずです。 –

+0

r1の行を1回しか使用できないようにするには、これをどうすれば変更できますか?言い換えれば、1つのタイムスタンプを2つの間隔にマッピングしないでください。ありがとう! –

1

何行が最初のテーブルに存在しない場合、その値は、開始と終了の間になるようにこれはSQLにかなり直接翻訳することができる

値:

select count(*) from Result2 r2 
where not exists (
    select * from Result1 r1 
    where r1.value between r2.start and r2.end 
) 
+0

あなたの答えを上記のものと比較すると、パフォーマンスに違いはありますか?ありがとう! –

+0

私は実際に言うことはできません - SQLオプティマイザはかなりスマートです。見つかる最善の方法はテストです!実際のデータで両方のバージョンを実行し、「実際の実行計画を含める」をオンにして、何をしているのかを確認してください – Blorgbeard

+0

r1の行を1回しか使用できないようにしたい場合、言い換えれば、1つのタイムスタンプを2つの間隔にマッピングしないでください。ありがとう! –

関連する問題