2017-07-20 12 views
2

私は2つのテーブルから下のデータセットを返すしたいと思います。表Aには温度の読みがあり、表Bには湿度の示度があります。これはLEADを使用して可能ですか、それとも良い方法がありますか?

表Iは私を得るために、出力を希望してい

基本的に

enter image description here

enter image description here

表B:彼らはまたので、このような場合のために、各テーブルにタイムスタンプを持っています温度と、次にその温度のタイムスタンプを読み取る次の湿度。だから、例えば、出力は次のようになります。

enter image description here

だから私は表Aで始まり、その後、タイムスタンプに基づいて、表Bで同じセンサーのための次の最も近い、次のレコードを検索したいんです。

+1

どのようにテーブルを結合する必要がありますか? –

+1

それは私が読書をしたいと思っているので、私はトレーラーとゾーンで推測しています。 –

+1

どちらの表にも「湿度」がありません。どのように計算されますか? –

答えて

1

ここではクロスが好きです。例:Aの各レコードに対して基本的に近い回

http://rextester.com/RGPS53348またはhttp://rextester.com/EKDX38312、マッチングトレーラーゾーンと1とBのレコードを検索し、最も近い時間で

これは、湿度のための「最も近い時間」を返す必要があります温度の時間およびタイの場合には、より早い時間/記録を湿度から戻す。

SELECT A.Trailer, A.Zone, A.temp, B.Humidity, A.Time A_time, B.Time B_Time 
FROM tableA A 
CROSS APPLY (SELECT Top 1 Z.* 
      FROM tableB Z 
      WHERE A.Trailer = Z.Trailer 
       and A.Zone = Z.Zone 
      --ORDER BY abs(A.Time- Z.Time) Asc, Z.Time) B --if int data 
      ORDER BY abs(datediff(ss,A.Time,Z.Time)),Z.time) B -- 

クエリは基本的に言う.. Aの各レコードに対して

  • 、時間[ABS(A.time-Z.timeに最も近い時間でレコードを見つけるために、サブクエリを実行します)]と同じトレーラとゾーンを持つレコード。
  • 結婚の場合は、以前のbレコードを返します。

  • Aレコードのトレーラー、ゾーン、温度、時刻、およびbレコードの湿度と時間を表示します。

+0

最後の行では、クエリはB.Timeが好きではありません....それはZ.Timeであるはずですか?私はまた、次のエラーを返す "データ型のdatetimeからfloatへの暗黙的な変換は許可されていません。このクエリを実行するにはCONVERT関数を使用してください" –

+0

はい、そうです。私の誤り。でb.time orderで修正されました。あなたの例が数値を示して以来、他のエラーについては、私は時間が数字であると仮定しました。コメントはそれが時間データ型であることを暗示しているようです。それは何ですか?日時または時間?または何?日付データ型の場合は、abs(datediff(n、A.Time、B.Time))を使う必要があります。あるいは、秒が重要であれば、より細分化することができます。 – xQbert

+0

ほとんどの場合、最も近いレコードはおよそ2秒後になるでしょう。 –

0

これを行うには、first_valueウィンドウ機能を使用できます。

select distinct a.* 
,first_value(b.humidity) over(partition by a.trailer,a.zone,a.time order by b.time) as humidity 
from tblA a 
join tblB b on a.trailer=b.trailer and a.zone=b.zone and a.time<=b.time 

あなたがそのような湿度の値がTABLEBの後の時点で存在しない場合null秒を表示したい場合にtableAでleft joinを使用してください。

関連する問題