好的,我已经找到了调整代码以产生我想要的结果的方法。
首先,我使用的数据如下:
CREATE TABLE JP1 (Serial_Number VarChar(20), Date_Time DateTime, Test_Result VarChar(255))
INSERT JP1 VALUES ('T900 09', '2009-10-10 01:15:00.000', 'NO TEST, Failed to Dump')
INSERT JP1 VALUES ('T901 09', '2009-10-10 01:20:00.000', '(BLUE) PASS (WHITE) FAIL')
CREATE TABLE JP2 (Serial_Number VarChar(20), Date_Time DateTime, Test_Result VarChar(255))
INSERT JP2 VALUES ('T900 09', '2009-10-15 01:15:00.000', 'NO TEST, Failed to Dump')
INSERT JP2 VALUES ('T900 09', '2009-10-15 02:15:00.000', '(BLUE) PASS (WHITE) FAIL')
INSERT JP2 VALUES ('T900 09', '2009-10-15 04:25:00.000', 'TEST ABORTED')
INSERT JP2 VALUES ('T900 09', '2009-10-15 04:59:00.000', '(BLUE) FAIL (WHITE) FAIL')
INSERT JP2 VALUES ('T900 09', '2009-10-15 05:09:00.000', '(WHITE) NO TEST')
INSERT JP2 VALUES ('T900 09', '2009-10-15 05:34:00.000', 'B=Pass.,W=FAIL, Final Fill')
INSERT JP2 VALUES ('T900 09', '2009-10-15 06:06:00.000', 'PASSED PD')
INSERT JP2 VALUES ('T900 09', '2009-10-15 06:30:00.000', 'TEST ABORTED')
INSERT JP2 VALUES ('T900 09', '2009-10-15 06:36:00.000', 'PASS')
INSERT JP2 VALUES ('T900 09', '2009-10-15 06:50:00.000', 'FAIL')
INSERT JP2 VALUES ('T900 09', '2009-10-05 08:08:00.000', 'NO TEST, Operator cancel')
接下来,我创建了两(2)个非常相似的查询。事实证明,我在
LEFT OUTER JOIN
子句需要在
WHERE
条款。
以下是我如何提取
第一
通过结果和日期:
SELECT LABEL.Serial_Number,
DECAY.Date_Time AS 'DecayDate',
CASE
WHEN DECAY.Test_Result LIKE '%fail%' THEN 'FAIL'
WHEN DECAY.Test_Result LIKE '%pass%' THEN 'PASS'
ELSE NULL
END AS 'DecayResult'
FROM JP1 AS LABEL
LEFT OUTER JOIN (
SELECT I.Serial_Number, I.Date_Time, I.Test_Result
FROM
JP2 AS I
LEFT OUTER JOIN JP2 AS O
ON
(I.Serial_Number=O.Serial_Number) AND
((O.Test_Result LIKE '%pass%') OR (O.Test_Result LIKE '%fail%')) AND -- //Gets First Test!
(O.Test_Result NOT LIKE '%NO TEST%') AND
(O.Date_Time<I.Date_Time) -- //(selects FIRST pass or fail)
-- (I.Date_Time<O.Date_Time) -- //(selects LAST pass or fail)
WHERE
(I.Test_Result LIKE '%pass%' OR I.Test_Result LIKE '%fail%') AND -- //Gets First Test!
(I.Test_Result NOT LIKE '%NO TEST%') AND
(O.Serial_Number IS NULL)
) AS DECAY ON
(LABEL.Serial_Number=DECAY.Serial_Number) AND
(LABEL.Date_Time<DECAY.Date_Time)
WHERE
(LABEL.Serial_Number IN (
SELECT DISTINCT Serial_Number
FROM JP1
WHERE (Serial_Number IS NOT NULL) AND
(DATEADD(yy, - 1, GETDATE()) < Date_Time))
)
以下是我如何提取
第一
试验结果和日期:
SELECT LABEL.Serial_Number,
DECAY.Date_Time AS 'DecayDate',
CASE
WHEN DECAY.Test_Result LIKE '%fail%' THEN 'FAIL'
WHEN DECAY.Test_Result LIKE '%pass%' THEN 'PASS'
ELSE NULL
END AS 'DecayResult'
FROM JP1 AS LABEL
LEFT OUTER JOIN (
SELECT I.Serial_Number, I.Date_Time, I.Test_Result
FROM
JP2 AS I
LEFT OUTER JOIN JP2 AS O
ON
(I.Serial_Number=O.Serial_Number) AND
((O.Test_Result LIKE '%pass%') AND (O.Test_Result NOT LIKE '%fail%')) AND -- //Gets First Pass!
(O.Test_Result NOT LIKE '%NO TEST%') AND
(O.Date_Time<I.Date_Time) -- //(selects FIRST pass or fail)
-- (I.Date_Time<O.Date_Time) -- //(selects LAST pass or fail)
WHERE
(I.Test_Result LIKE '%pass%' AND I.Test_Result NOT LIKE '%fail%') AND -- //Gets First Pass!
(I.Test_Result NOT LIKE '%NO TEST%') AND
(O.Serial_Number IS NULL)
) AS DECAY ON
(LABEL.Serial_Number=DECAY.Serial_Number) AND
(LABEL.Date_Time<DECAY.Date_Time)
WHERE
(LABEL.Serial_Number IN (
SELECT DISTINCT Serial_Number
FROM JP1
WHERE (Serial_Number IS NOT NULL) AND
(DATEADD(yy, - 1, GETDATE()) < Date_Time))
)
我希望其他人觉得这有用!
乔