2017-02-14 91 views
2

私は以下のロジックにぶつかっています。ステータスが失敗したときはいつでも、以前に成功したときにはmax(EndTime)にする必要があります。たとえば、以下のデータの場合、Batch = 3987の場合、lastrefreshdate23-01-2017である必要がありますが、13-02-2017ではありません。TSQL - 最後に成功した日付を取得

以下は、データとクエリのスニペットです。

Batch TableName IsFullLoad Status EndTime  LastRefreshDate 
5524 SA     1 Loaded 13-02-2017 13-02-2017 
4746 SA     1 Loaded 06-02-2017 06-02-2017 
4174 SA     1 Loaded 31-01-2017 31-01-2017 
3987 SA     1 Failed 30-01-2017 13-02-2017 
3372 SA     1 Loaded 23-01-2017 23-01-2017 
2651 SA     1 Loaded 16-01-2017 16-01-2017 
1987 SA     1 Loaded 09-01-2017 09-01-2017 
1379 SA     1 Loaded 02-01-2017 02-01-2017 
835  SA     1 Loaded 26-12-2016 26-12-2016 
189  SA     1 Loaded 19-12-2016 19-12-2016 
52  SA     1 Loaded 17-12-2016 17-12-2016 

SQL:

SELECT TOP 40* 
FROM (
SELECT 
bi.Id, 
bi.TableName, 
bi.IsFullLoad, 
bi.JobId, 
[Status], 
bi.CompletTime, 
CASE 
WHEN bi.IsFullLoad = 1 AND bi.[Status] = 'Failed' 
THEN 
(
SELECT MAX(CompletTime) FROM Audit.T1 bb 
    WHERE [Status]= 'Loaded' AND bb.IsFullLoad = 1 AND bb.TableName = bi.TableName 
    GROUP BY bb.TableName 
) 
ELSE 
bi.CompletTime 
END AS Validto 
FROM Audit.T1 bi 
WHERE TableName = 'Salesforce_Account' AND bi.IsFullLoad = 1 
) x 
ORDER BY x.CompletTime desc 

すべてのヘルプは本当に感謝しています。 ありがとうございました。

答えて

1

あなたの内側のクエリは、条件が満たされているテーブルから最後completTimeを選択されていますが、条件にはどこであなたは、現在のレコードのCompletTimeを参照しません。

変更このことから、内側のクエリ:これに

SELECT MAX(CompletTime) FROM Audit.T1 bb 
WHERE [Status]= 'Loaded' AND bb.IsFullLoad = 1 AND bb.TableName = bi.TableName 
GROUP BY bb.TableName 

:もちろん

SELECT TOP 1 CompletTime 
FROM Audit.T1 bb 
WHERE [Status]= 'Loaded' 
AND bb.IsFullLoad = 1 
AND bb.TableName = bi.TableName 
AND CompletTime < b1.CompletTime 
ORDER BY CompletTime DESC 

、あなたはまだMAXを使用することができます - しかし、関連する条件を追加します。 Group byは必要ありません。

SELECT MAX(CompletTime) 
FROM Audit.T1 bb 
WHERE [Status]= 'Loaded' 
AND bb.IsFullLoad = 1 
AND bb.TableName = bi.TableName 
AND CompletTime < b1.CompletTime 
関連する問題