2013-03-11 3 views
2

나는 아래와 같이 테이블을 가지고 있습니다. 나는 오라클 10g를 사용하고 있습니다.우선 순위에 따라 별개의 행을 가져 옵니까?

TableA 
------ 
id status 
--------------- 
1 R 
1 S 
1 W 
2 R 

상태와 함께 고유 ID를 가져와야합니다. 고유 ID 및 해당 상태에 대한 쿼리를 모든 4 행을 얻을 경우. 하지만 이드 당 오직 한 명만 있어야합니다. 여기에서 id 1에는 3 개의 별개의 상태가 있습니다. 여기에 우선 순위에 따라 단 하나의 행을 가져와야합니다.

첫 번째 우선 순위는 'S'이고 두 번째 우선 순위는 'W'이고 세 번째 우선 순위는 'R'입니다.

제 경우에는 아래와 같이 두 개의 레코드를 가져와야합니다.

id status 
-------------- 
1 S 
2 R 

어떻게하면됩니까? 도와주세요.

감사합니다.

답변

0

이것이 내가하는 첫 번째 일이지만, 더 좋은 방법이있을 수 있습니다.

Select id, case when status=1 then 'S' 
       when status=2 then 'W' 
       when status=3 then 'R' end as status 
from(
    select id, max(case when status='S' then 3 
         when status='W' then 2 
         when status='R' then 1 
        end) status 
    from tableA 
    group by id 
    ); 
0

은 당신이 유사한 쿼리를 작성할 수 있습니다 완수하려면 다음과 같은

 -- sample of data from your question 
SQL> with t1(id , status) as (
    2 select 1, 'R' from dual union all 
    3 select 1, 'S' from dual union all 
    4 select 1, 'W' from dual union all 
    5 select 2, 'R' from dual 
    6 ) 
    7 select id -- actual query 
    8  , status 
    9 from (select id 
10    , status 
11    , row_number() over(partition by id 
12          order by case 
13             when upper(status) = 'S' 
14             then 1 
15             when upper(status) = 'W' 
16             then 2 
17             when upper(status) = 'R' 
18             then 3 
19             end 
20         ) as rn 
21   from t1 
22  ) q 
23 where q.rn = 1 
24 ; 

     ID STATUS 
---------- ------ 
     1 S 
     2 R 
+0

디코딩이 단일 장소에 있기 때문에 이것은 나보다 낫습니다. 내 대답은 약간 진보 된 분석 기능을 사용하지 않는 '장점'을 가지고있다. –

0
select id,status from 
(select id,status,decode(status,'S',1,'W',2,'R',3) st from table) where (id,st) in 
(select id,min(st) from (select id,status,decode(status,'S',1,'W',2,'R',3) st from table)) 
4
select 
    id, 
    max(status) keep (dense_rank first order by instr('SWR', status)) as status 
from TableA 
group by id 
order by 1 

fiddle

+0

내 투표가 이걸로 간다 - 독창성을 담고있다 :) –

1
select id , status from (   
select TableA.*, ROW_NUMBER() 
OVER (PARTITION BY TableA.id ORDER BY DECODE(
     TableA.status, 
     'S',1, 
     'W',2, 
     'R',3, 
      4)) AS row_no 
FROM TableA) 
where row_no = 1 
0

뭔가 ???

SQL> with xx as(
    2  select 1 id, 'R' status from dual UNION ALL 
    3  select 1, 'S' from dual UNION ALL 
    4  select 1, 'W' from dual UNION ALL 
    5  select 2, 'R' from dual 
    6 ) 
    7 select 
    8  id, 
    9  DECODE(
10   MIN(
11    DECODE(status,'S',1,'W',2,'R',3) 
12   ), 
13  1,'S',2,'W',3,'R') "status" 
14 from xx 
15 group by id; 

     ID s 
---------- - 
     1 S 
     2 R 

여기 논리는 매우 간단합니다. 최소 (우선 순위가 높은 즉, 하나를) 찾을 그런 다음, '우선 순위'설정 값을 디코딩을 수행하고 다시 추가 값 MOD() 예제를 사용하여 자사의 '상태'

0

를 얻기 위해 다시 디코딩 :

SELECT id, val, distinct_val 
    FROM 
    (
    SELECT id, val 
     , ROW_NUMBER() OVER (ORDER BY id) row_seq 
     , MOD(ROW_NUMBER() OVER (ORDER BY id), 2) even_row 
     , (CASE WHEN id = MOD(ROW_NUMBER() OVER (ORDER BY id), 2) THEN NULL ELSE val END) distinct_val 
    FROM 
    (
    SELECT 1 id, 'R' val FROM dual 
    UNION 
    SELECT 1 id, 'S' val FROM dual 
    UNION 
    SELECT 1 id, 'W' val FROM dual 
    UNION 
    SELECT 2 id, 'R' val FROM dual 
    UNION       -- comment below for orig data 
    SELECT 3 id, 'K' val FROM dual 
    UNION 
    SELECT 4 id, 'G' val FROM dual 
    UNION 
    SELECT 1 id, 'W' val FROM dual 
)) 
    WHERE distinct_val IS NOT NULL 
/

ID VAL DISTINCT_VAL 
-------------------------- 
1  S  S 
2  R  R 
3  K  K 
4  G  G 
관련 문제