2017-02-14 62 views
2

我感到以下逻辑。每当状态失败时,我需要在max(EndTime)之前成功。例如在以下数据中,对于Batch = 3987lastrefreshdate应该是23-01-2017而不是13-02-2017TSQL - 获取最后成功日期

下面是数据和查询的片段。

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