2017-10-16 10 views
1

I次の2つの表があります。結果)(別のテーブルを参照し、最大に隣接するデータを返す

Data tables

SQL Server 2012を使用するが、私は時間単位のテーブルMaxWaitTimeSplitからINTERVALを知りたいです毎日のDailyテーブルからのものと一致します。私はここでwindow functionを使用する必要があると仮定していますが、正しい答えを把握することはできません。

Expected Result

MaxWaitTimeは全体の日のために0で倍、そしてhourlyテーブルの試合からしたがって、すべての行があるかもしれません。このシナリオでは、私はNull答えを好むでしょうが、その日の最も早いINTERVALはうまくいくでしょう。

複数のINTERVALsの待ち時間が同じ場合もあります。このシナリオでは、MaxWaitTimeが存在する最初のINTERVALが返されます。

答えて

1

あなたは多くても1つの試合にしたい場合は、outer applyを使用することができます。

は、単純な左のように見えるテーブル間に動作するはず参加。私は単純に上記のデータを参照しています...

クエリは次のようになります。結合に失敗すると、NULLが戻されます。それをあなたが複数の一致のためにNULLをしたい場合、あなたは似た何かを行うことができます

select d.*, h.interval as maxinterval 
from daily d outer apply 
    (select top 1 h.* 
     from hourly h 
     where convert(date, h.interval) = d.row_date and 
      h.split = d.split and 
      h.maxwaittime = d.maxwaittime 
     order by h.interval asc 
    ) h; 

..行くを与える:

select d.*, h.interval as maxinterval 
from daily d outer apply 
    (select top 1 h.callsoffered, h.split, max(h.interval) as maxinterval 
     from hourly h 
     where convert(date, h.interval) = d.row_date and 
      h.split = d.split and 
      h.maxwaittime = d.maxwaittime 
     group by h.maxwaittime, h.split 
     having count(*) = 1 
    ) h; 
+0

「OUTER APPLY」がトリックを行いました!ありがとう! –

0

単純な左結合のように見える表の間で動作する必要があります。私は単純に上記のデータを参照しています...

クエリは次のようになります。結合に失敗すると、NULLが戻されます。それをやってみる。..

select daily.* ,hourly.callsoffered, hourly.interval as maxinterval 

from daily 

left join hourly 
    on convert(date,hourly.interval) = daily.row_date 
    and hourly.split = daily.split 
    and hourly.maxwaittime = daily.maxwaittime 
+0

ハリー、お返事に感謝を。私はまた、左の結合が最初にそれを行うだろうと思ったが、上記の条件ではこの解決法は失敗する。複数の行が一致すると、同じ日に複数の結果が得られる。上記の表は実際にはイラストだけです。 –

+0

実際のデータを入力してください。イラストレーションのデータは、上記のクエリが機能するはずであることを示唆しています。何が繰り返されていますか?インターバル以外のように見えますが、すべてのデータはデイリーテーブルで利用できます。データの複製方法はわかりません。異なるインターバルで同じ最大待ち時間を持たない限り、 – Harry

関連する問題