Oracle 选择不同的列,优先级第二列值

Oracle 选择不同的列,优先级第二列值,oracle,group-by,distinct,Oracle,Group By,Distinct,我想选择distinct/group by column,并为第二列只显示一个值(3个可能的值中的一个):如果A出现在组中,则显示它;如果不显示B,如果不显示C 这是表格: A B ---- ----- FST A FST B FST C INCS C INCS B ASW A AWR C WER C WER C WER B 结果 A B ---- ----- FST

我想选择distinct/group by column,并为第二列只显示一个值(3个可能的值中的一个):如果
A
出现在组中,则显示它;如果不显示
B
,如果不显示
C

这是表格:

A       B
----    -----
FST     A
FST     B
FST     C
INCS    C
INCS    B
ASW     A
AWR     C
WER     C   
WER     C
WER     B
结果

A       B
----    -----
FST     A
INCS    B
ASW     A
AWR     C
WER     B

对于给定的数据,最简单的方法是:

select A, min(B)
from table t
group by A;
对于字母顺序不正确的更一般的问题(如果您想在“A”之前返回“B”),可以使用
case
语句:

select A,
       (case min(case B when 'A' then 1 when 'B' then 2 when 'C' then 3 else 4 end)
             when 1 then 'A'
             when 2 then 'B'
             when 3 then 'C'
             else '???'
        end)
from table t
group by A;
编辑:

Oracle有一种比嵌套选择更简单的方法:

select A,
       max(B) keep (dense_rank first
                    order by (case B when 'A' then 1 when 'B' then 2 when 'C' then 3 else 4 end)
                   ) as BestB
from table t
group by A;

对于给定的数据,最简单的方法是:

select A, min(B)
from table t
group by A;
对于字母顺序不正确的更一般的问题(如果您想在“A”之前返回“B”),可以使用
case
语句:

select A,
       (case min(case B when 'A' then 1 when 'B' then 2 when 'C' then 3 else 4 end)
             when 1 then 'A'
             when 2 then 'B'
             when 3 then 'C'
             else '???'
        end)
from table t
group by A;
编辑:

Oracle有一种比嵌套选择更简单的方法:

select A,
       max(B) keep (dense_rank first
                    order by (case B when 'A' then 1 when 'B' then 2 when 'C' then 3 else 4 end)
                   ) as BestB
from table t
group by A;

您使用的是特定风格的sql吗?oracle 11g,尽可能优化。.您使用的是特定风格的sql吗?oracle 11g,尽可能优化。.是否有一种方法可以将
LIKE
操作符集成到
case
操作中?@nir:是的<代码>当B喜欢“A%”时的大小写,然后是1当B喜欢“B%”时的大小写,然后是2…有没有办法将
like
操作符集成到
CASE
操作中?@nir:有<代码>当B喜欢“A%”时为1,当B喜欢“B%”时为2…