2016-04-15 6 views
1

問題がどこにあるのかわかりにくいです。私はいくつかの仕事を周期的に異なる頻度で走らせている。これらのジョブからは、ジョブテーブルのすべてのユニークなジョブの最新のジョブ実行データのデータが必要です。すべてのユニークジョブの最新ジョブのデータを取得

ご協力いただければ幸いです。

ジョブズ - マスター表

Job_Id Name 
1 Job1 
2 Job2 
3 Job3 

ジョブズ歴史

Id  Job_Id  StartTime      EndTime 
100  1  2015-03-11 16:03:49.760  2015-03-11 16:09:49.760 
101  2  2015-03-10 16:03:49.760  2015-03-10 16:40:49.760 
102  3  2015-02-11 16:03:49.760  2015-02-11 16:09:49.760 
103  2  2015-03-11 16:03:49.760  2015-03-11 16:09:49.760 
104  1  2015-03-11 16:08:49.760  2015-03-11 16:12:49.760 
105  1  2015-03-11 16:12:49.760  2015-03-11 16:16:49.760 
106  1  2015-03-11 16:20:49.760  2015-03-11 16:29:49.760 

出力:私は以下のようなものが必要。各ジョブの最新のジョブデータ。各ジョブの頻度は同じではありません。

Id   Name StartTime        EndTime 
106  Job1  2015-03-11 16:20:49.760  2015-03-11 16:29:49.760 
103  Job2  2015-03-11 16:03:49.760  2015-03-11 16:09:49.760 
102  Job3  2015-02-11 16:03:49.760  2015-02-11 16:09:49.760 

SELECT top 1* FROM Jobs j 
    INNER JOIN JobsHistory jh ON j.Id = jh.Job_Id 
    where jh.Job_Id in (select Id from Jobs) 
    order by jh.starttime desc 
+0

@Siyual:データを編集していただきありがとうございます。残念ながら私はできませんでした。申し訳ありません。 – redsam

答えて

2

このような何か

OVER()句とROW_NUMBER()は(降順)のStartTimeによって並べ替えられ、あなたの仕事を数と各JOB_IDのために仕切られ、この番号付けを行いますしてみてください。番号1のすべての行がJOB_ID

SELECT * 
FROM 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY Job_Id ORDER BY StartTime DESC) AS OrderNr 
      ,* 
    FROM Jobs j 
     INNER JOIN JobsHistory jh ON j.Id = jh.Job_Id 
) AS tbl 
WHERE tbl.OrderNr=1 
+0

クイック返信をありがとう。残念ながら私はリモートからデータベースに接続するアクセス権を持っていません。私は月曜日の朝、私が職務に就いてそれをテストし、あなたに知らせます。 – redsam

+0

結果を見るために月曜日の朝まで待つことができませんでした。私はSQL Fiddle http://sqlfiddle.com/#!3/945e1/1を複製して作成しました。それは完全に動作しています。助けてくれてありがとう。 – redsam

+0

あなたのソリューションはうまくいきます。しかし、私は巨大なテーブルを照会すると10〜12秒かかります。 CTEを使用して別の方法でクエリを実行しましたが、これははるかに高速です(<1秒)。ちょうど共有したいと思った。他人を助けるかもしれないように。 – redsam

0

あたり直近でなければなりませんShnugoが提供する回答は正常に動作しているが、それは遅いです。私はCTEを使用してクエリする別の方法を見つけました、それははるかに高速です(< 1秒)。他の人を助けるためにクエリを共有したかっただけです。

WITH JH_CTE(Id, RecentRunId) AS (SELECT Job_Id, max(Id) FROM JobsHistory GROUP BY Job_Id) 
SELECT * from Jobs j 
JOIN JH_CTE on j.Job_Id = JH_CTE.Id 
JOIN JobsHistory jh on jh.Id = JH_CTE.RecentRunId 
関連する問題