2013-02-16 51 views
1

我有以下细节提取一行特定场景

EMP_NAME  TEST_RESULT RUN_DATE 
---------------------------------------------- 
John   Pass 12-FEB-2013 18:03:55 
Albert   Fail 12-FEB-2013 18:24:29 
Chris   Pass 12-FEB-2013 18:24:28 
John   Fail 12-FEB-2013 19:32:35 
Chris   Pass 12-FEB-2013 19:32:35 
Steve   Pass 12-FEB-2013 20:04:35 

现在我需要具有独特的名称和TEST_RESULT提取行的表。但是,如果员工同时具有合格和不合格的结果,则测试结果应该只有“失败”结果。查询的结果应该是

EMP_NAME  TEST_RESULT RUN_DATE 
---------------------------------------------- 
Albert   Fail 12-FEB-2013 18:24:29 
Chris   Pass 12-FEB-2013 18:24:28 
John   Fail 12-FEB-2013 19:32:35 
Steve   Pass 12-FEB-2013 20:04:35 

所有我关心的只有一个员工姓名,如果有两个结果及格和不及格该员工,告诉我只有失败的记录,我不计较时间。如果一个员工有两个结果作为“合格”和“合格”,我仍然需要一个记录,我不在乎时间。

回答

2


Select emp_name, test_result, run_date
from (
select emp_name, test_result, run_date,
row_number() over (partition by emp_name
order by test_result, run_date) rn
from
T1)
where rn=1

+0

+1,但为了未来的求职者的利益:这个特定的解决方案的工作原理是因为“FAIL”<'PASS''属实。如果所需的排序标准不按字母顺序排列,则需要进行调整。 – APC 2013-02-17 04:24:36

+0

这完美的工作..谢谢! – 2013-02-17 04:24:43

+0

另外,由于“我不关心时间”,但是对于我们其他人确实重视可重复性的必要条件,对于OP来说,由RUN_DATE进行的附加排序是严格不必要的。 – APC 2013-02-17 04:26:18

1

这样的事情可能会奏效。

select emp_name, test_result, run_date 
from YourTable 
where test_result = 'Fail' 
union 
select emp_name, test_result, run_date 
from YourTable 
where test_result = 'Pass' 
and emp_name in 
(select emp_name 
from YourTable 
where TestResult = 'Pass' 
minus 
select emp_name 
from YourTable 
where TestResult = 'Fail' 
) 
1
SELECT EMP_NAME, TEST_RESULT, RUN_DATE 
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY t1.EMP_NAME ORDER BY RUN_DATE) AS RowNumber, 
     t1.EMP_NAME, TEST_RESULT, RUN_DATE 
    FROM MyTable t1 
    LEFT JOIN 
    (SELECT DISTINCT EMP_NAME 
    FROM MyTable 
    WHERE TEST_RESULT = 'Fail' 
) AS EMP_With_Failure ON t1.EMP_NAME = EMP_With_Failure.EMP_Name 
    WHERE t1.TEST_RESULT = 'Fail' OR EMP_With_Failure.EMP_NAME IS NULL) t 
WHERE RowNumber = 1 

这个查询会过滤掉任何成功的记录为有故障的任何用户,您仍然需要过滤结果集,让每用户

+0

我只有一条记录很确定,如果你在问题中的数据上运行这个查询,它会返回两次约翰。 – 2013-02-16 21:15:16

+0

@DanBracuk你是正确的,我没有为每个用户返回一行,因为OP没有指定当存在多个时应该返回哪个记录,它应该不是一个挑战! – 2013-02-16 21:19:39

+0

@DanBracuk你的查询将返回克里斯两次:) – 2013-02-16 21:21:32