2014-04-04 2 views
0

내가 같은 테이블 데이터가 :방법 PL/SQL에서 일부 경우에 최대 값을 얻을 수

작업 종류 작업 이름 작업 없음 YES_NO
----------- X- --------- 1 -------- N
A ----------- X ---------- 2 ----- --- N
A ----------- X ---------- 3 -------- Y
A -------- --- X ---------- 4 -------- Y
A ----------- X ---------- 5 -------- N
B ----------- Z ---------- 1 -------- N
B --- -------- Z ---------- 2 -------- N
B ----------- Z ---------- 3 -------- N

원하는 결과가 있어야한다 :

작업 종류 작업 이름 작업 없음 YES_NO

에게

------------ X ---------- 4 ----- ---- Y
B ------------ Z ---------- 3 -------- N

하지만 성공하지 못합니다. 이 라인

케이스 :YES_NO 값이 'Y' 및 경우 YES_NO 값이 'Y' 각 작업 유형 및 작업 이름에 대한 어떠한 최대 작업을 얻을 수없는 경우 0

내가 그런 일을하려고 각 작업 유형에 대한 최대 task_no을 얻고 작업 이름 :

Select Job_Type,Job_Name,Yes_NO,max(Task No) 
From Table 
where Yes_NO='Y' 
Group By Job_Type,Job_Name,Yes_NO 
UNION 
Select Job_Type,Job_Name,Yes_NO,max(Task No) 
From Table 
where not exists(Select 1 
From Table 
where Yes_NO='Y') 
Group By Job_Type,Job_Name,Yes_NO 

내 잘못이 있습니까? 아니면 더 쉬운 방법이 있습니까?

고마워요.

답변

0

이 시도 :

Select Job_Type,Job_Name,Yes_NO,max(Task No) 
From Table 
where Yes_NO='Y' 
Group By Job_Type,Job_Name,Yes_NO 
UNION 
Select t1.Job_Type,t1.Job_Name,t1.Yes_NO,max(t1.Task No) 
From Table t1 
    Left Join (select distinct Job_Type,Job_Name 
      from Table where Yes_NO = 'Y' 
      ) t2 
    on t2.Job_Type = t1.Job_Type 
    and t2.Job_Name = t1.Job_Name 
Where t2.Job_Type is null 
Group By t1.Job_Type,t1.Job_Name,t1.Yes_NO 
+0

안녕하세요 론, 고용 _ 값이된다 'N'은 필터링은't2.Job_Type이 null' 라인이하는 무엇 – LeoMessi

+0

입니다 모든 Job_Type 및 Job_Name 레코드에는 'Yes_NO ='Y ''레코드가 하나 있습니다. 다음은 귀하의 데이터 세트로 결과를 보여주는 SQL Fiddle입니다 : http://www.sqlfiddle.com/#!2/98c395/4 –

+0

예. 나는 그것을 놓칩니다. 감사합니다. – LeoMessi

0

당신이 사용 FIRST/LAST 집계 함수 또는 ROW_NUMBER 분석 기능을 단순화 할 수 있습니다.

select job_type, max(job_name), 
     max(task_no) keep (
     dense_rank first order by 
     case when yes_no = 'Y' then 1 else 2 end, 
     task_no desc 
     ), 
     max(yes_no) keep (
     dense_rank first order by 
     case when yes_no = 'Y' then 1 else 2 end 
     ) 
from t_table 
group by job_type; 

select job_type, job_name, task_no, yes_no 
from (
    select job_type, job_name, task_no, yes_no, 
    row_number() over (partition by job_type 
        order by case when yes_no = 'Y' then 1 else 2 end, 
        task_no desc 
        ) r 
    from t_table 
) 
where r = 1; 

결과 :

| JOB_TYPE | JOB_NAME | TASK_NO | YES_NO | 
|----------|----------|---------|--------| 
|  A |  X |  4 |  Y | 
|  B |  Z |  3 |  N | 

Fiddle.

0

SQL 피들 (SQL Fiddle)에서 저에게 효과가있는 부분이 있습니다. null.Problem 내가 YES_NO 값에 대한 최대 task_no을 얻을 질수하지

http://sqlfiddle.com/#!4/fa5b7/6

select a."Job Type", a."Job Name", max("Task No") as Task_No, b.Yes_No 
from maxvalueexample a 
inner join (select "Job Type", "Job Name", max("Yes_NO") as Yes_No 
      from maxvalueexample 
       group by "Job Type", "Job Name")b 
     on b."Job Type" = a."Job Type" 
     and b."Job Name" = a."Job Name" 
     and b.Yes_No = a."Yes_NO" 
group by a."Job Type", a."Job Name", b.Yes_No 
관련 문제