4

我有一张如下表。我使用的是 oracle 10g。

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

我需要获得不同的 ID 及其状态。如果我查询不同的 id 及其状态,我会得到所有 4 行。但我应该只得到 2 个。每个 id 一个。这里 id 1 有 3 个不同的状态。在这里,我应该根据优先级只得到一行。

第一优先级是“S”,第二优先级是“W”,第三优先级是“R”。

就我而言,我应该得到如下两条记录。

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

要完成它,您可以编写类似的查询:

     -- 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, 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 回答
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

像这样的???

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

在这里,逻辑很简单。进行解码以设置“优先级”,然后找到 MIN(即具有较高优先级的值)并再次将其解码以获取其“状态”

于 2013-03-11T11:32:53.287 回答