Sql 如何通过使用case检查并选择其值,将同一主键的3行变成1行

Sql 如何通过使用case检查并选择其值,将同一主键的3行变成1行,sql,oracle,concatenation,case,Sql,Oracle,Concatenation,Case,例如,在这里,从这个表 key | status 1001 | A 1001 | D 1001 | C 层次结构将是C>D>A 如果统计数据包含C作为值,则人员状态将在一行中变为C。它将是这样的: key | status 1001 | C 它将忽略D和A,因为它有值C。如果它没有值C,那么它将在A之前先检查D。 那么,我该怎么做呢?我不知道如何把3行变成1行。我试着用 ''' CASE WHEN STATUS IN('C')THEN 'C' ELSE

例如,在这里,从这个表

key  | status
1001 |   A
1001 |   D
1001 |   C
层次结构将是C>D>A

如果统计数据包含C作为值,则人员状态将在一行中变为C。它将是这样的:

key  | status
1001 |   C
它将忽略D和A,因为它有值C。如果它没有值C,那么它将在A之前先检查D。 那么,我该怎么做呢?我不知道如何把3行变成1行。我试着用

''' CASE WHEN STATUS IN('C')THEN 'C'
         ELSE WHEN STATUS IN('D') THEN 'D'
         ELSE WHEN STATUS IN('A') THEN 'A'
    END AS STATUS '''

但它给出了错误,仍然无法将行转换为1

您可以尝试下面的方法-

select key, status
from tablname
order by case when status='C' then 1 when status='D' then 2 when status='A' then 3 else 99 end 
FETCH FIRST 1 ROW

你可以试试下面的方法-

select key, status
from tablname
order by case when status='C' then 1 when status='D' then 2 when status='A' then 3 else 99 end 
FETCH FIRST 1 ROW

您可以按如下方式使用分析函数
行数

Select * from
(Select t.*, 
       Row_number() over (partition by key order by case when status = 'C' then 1 
                                when status = 'D' then 2
                                when status = 'A' then 3 end) as rn
  From your_table)
Where rn = 1;

您可以按如下方式使用分析函数
行数

Select * from
(Select t.*, 
       Row_number() over (partition by key order by case when status = 'C' then 1 
                                when status = 'D' then 2
                                when status = 'A' then 3 end) as rn
  From your_table)
Where rn = 1;