2016-07-14 4 views
0

이벤트 테이블을 통해 반복되는 쿼리가 있습니다. 첫 번째 테스트가 통과되면 첫 번째 테스트에만 관심이 있습니다. 예를 들어 다음과 같은 경우 :mysql을 사용하여 레코드를 제외하려면 어떻게해야합니까?

s/n  test_result first test taken and passed 
DX123 Terminated 2016-06-16 09:33:38 
DX124 Passed  2016-06-16 10:12:01 
DX125 Failed  2016-06-16 08:27:48 
DX126 Passed  2016-06-16 08:28:16 
DX127 Passed  2016-06-16 08:25:02 

그러면 우리가 원하는 것은 통과 한 첫 번째 테스트뿐입니다. DX125가 30 분이 지난 후에 데이터 세트에 DX125를 원하지 않습니다.

그래서 위의 표는 반환 :

널 (null)로 실패한 테스트를 반환
select serial_number, test_name, 
    IF(test_result = 'passed', min(START_DATE_TIME), null) as 'first test taken and passed' 

from 
    test_results 
where 
    (test_time > '2016-06-16 00:00:00' AND test_time < '2016-06-16 23:59:59') 

group by serial_number, test_name 
order by serial_number asc; 

, 나는 오히려 전혀 존재하지 않았다 것 : 내가 사용 해봤

s/n  test_result first test taken and passed 
DX124 Passed  2016-06-16 10:12:01 
DX126 Passed  2016-06-16 08:28:16 
DX127 Passed  2016-06-16 08:25:02 

. 이 경우에는 if 문을 false로 설정하면 아무것도 반환하지 않으므로 우아하게 처리됩니다. 할 수 있습니까?

감사합니다.

+0

입력 데이터 및 쿼리의 열 이름이 일치하지 않으며 샘플 출력이 없습니다. 원하는 결과물을 보여줌으로써 질문을 명확히 할 수 있습니까? –

+0

행'DX127 합격 2016-06-16 08 : 25 : 02'을 원했습니까? – Blank

+0

테스트 날짜 (test_time) = '2016년 6월 16일'및 test_result가 = 의해 그룹을 '통과' test_results 에서 첫 테스트 취하여 전달 '등이 선택 SERIAL_NUMBER, test_name, 분 (START_DATE_TIME) serial_number, test_name order by serial_number asc; –

답변

1

이 쿼리는 실패하지 않은 그룹에 대해 일련 번호, 테스트 이름 및 가장 빠른 테스트 시간을 제공합니다. HAVING 절은 하나 이상의 실패가있는 그룹을 필터링합니다.

SELECT serial_number, 
     test_name, 
     MIN(test_time) AS 'first test taken and passed' 
FROM 
    test_results 
WHERE 
    test_time > '2016-06-16 00:00:00' AND test_time < '2016-06-16 23:59:59' 
GROUP BY serial_number, test_name 
HAVING SUM(CASE WHEN test_result != 'passed' THEN 1 ELSE 0 END) = 0 
ORDER BY serial_number ASC 
2

당신은 그룹화 한 후 행을 제외 할 Having() 절을 사용할 수 있습니다 :

SELECT serial_number, 
     test_name, 
     IF(status = "Passed",CONVERT(MIN(test_time), CHAR),'not passed') AS 'first_test_taken_and_passed' 
FROM 
    test_results 
WHERE 
    test_time > '2016-06-16 00:00:00' 
    AND test_time <= '2016-06-16 23:59:59' 
GROUP BY serial_number, test_name 
HAVING first_test_taken_and_passed <> "not passed" 
ORDER BY serial_number ASC 

편집 : 업데이트 대답 첫번째 의견에 따라. 포함 Having() 조항

+0

아니요, 통과 한 첫 번째 테스트가 반환됩니다. 통과하면 첫 번째 테스트가 필요합니다. – gedq

+0

이제 알았습니다. 나는 당신의 필요에 맞는 대답을 편집했다. 'Having()'절이 필요합니다. – Djeramon

+0

@Djeramon 그가 무엇을 묻고 있는지 전혀 모르지만 방금 쿼리를 다시 업데이트했습니다. 어쩌면 우리 중 한 명이 그것을 얻을 것입니다. –

관련 문제