4

以下の表があります。私はOracle 10gを使用しています。

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

ステータスとともに個別のIDを取得する必要があります。個別の ID とそのステータスを照会すると、4 行すべてが取得されます。しかし、私は2.IDごとに1つだけ取得する必要があります。ここで、id 1 には 3 つの異なるステータスがあります。ここでは、優先度に基づいて 1 つの行のみを取得する必要があります。

1 番目の優先順位は 'S' で、2 番目の優先順位は 'W' で、3 番目の優先順位は 'R' です。

私の場合、以下のように 2 つのレコードを取得する必要があります。

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

どうやってやるの?私を助けてください。

ありがとう!

4

7 に答える 7

4
于 2013-03-11T10:30:33.680 に答える
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
于 2013-03-11T10:33:19.850 に答える
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

ここでは、ロジックは非常に単純です。「優先度」を設定するために DECODE を実行してから、MIN (優先度の高いもの) の値を見つけ、再度デコードして「ステータス」を取得します。

于 2013-03-11T11:32:53.287 に答える
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
于 2013-03-11T10:14:44.653 に答える
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))
于 2013-03-11T10:17:18.807 に答える
0

値を追加した MOD() の使用例:

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
于 2013-03-11T15:12:04.373 に答える
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
    );
于 2013-03-11T10:10:33.297 に答える