ОК, я нашел способы настроить код для получения желаемых результатов.
Сначала, вот данные, которые я использовал:
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
.
Вот как я извлекаю результат и дату FIRST PASS:
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))
)
Вот как я извлекаю FIRST Результат теста и дату:
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))
)
Я надеюсь, что другие найдут это полезным!
~Джо