如何识别每行具有最大值的列

How to Identify the column with the max value per row

我有一个 table,如下所示:

--------------------------------
ENTITY  |  VALUE X  |  VALUE Y  
--------------------------------
AAA     |    100    |    50     
--------------------------------
BBB     |     0     |    20      
--------------------------------
CCC     |    null   |    null   
--------------------------------
DDD     |    100    |    100    
--------------------------------

我想确定哪一列(X 或 Y)具有最大值(在我的实际数据集中有五列,但为了简单起见,我在这里使用两列)。

如果两者都为null,我希望结果为null。

如果出现平局,我想为决胜局设置一个固定排名 (x > y > z...)

所需的输出如下所示

---------------------------------------------------
ENTITY  |  VALUE X  |  VALUE Y  |  DESIRED OUTPUT  
---------------------------------------------------
AAA     |    100    |    50     |         X        
---------------------------------------------------
BBB     |     0     |    20     |         Y          
---------------------------------------------------
CCC     |    null   |    null   |       null       
---------------------------------------------------
DDD     |    100    |    100    |         X        
---------------------------------------------------

我一直在尝试使用 MAX() 但是,我认为这主要是为了比较列中的行,而不是相反...

如有任何帮助,我们将不胜感激。谢谢!

如果您有两个以上的列,如问题中所述,那么最具扩展性的方法是使用横向连接。这个想法是将列转为行,过滤掉 null 值,然后按降序值排序,并仅保留第一行:

select t.*, x.*
from mytable t
outer apply (
    select col
    from (
        select 'X' col, t.value_x val from dual
        union all select 'Y', t.value_y from dual
    ) x
    where x.val is not null
    order by x.val desc
    fetch first 1 row only
) x

Demo on DB Fiddlde:

ENTITY | VALUE_X | VALUE_Y | COL 
:----- | ------: | ------: | :---
AAA    |     100 |      50 | X   
BBB    |       0 |      20 | Y   
CCC    |    null |    null | null
DDD    |     100 |     100 | X   

您可以使用 case 逻辑来做到这一点。假设 none 个值是 NULL:

select t.*,
       (case greatest(x, y)
            when x then 'x'
            when y then 'y'
        end) 
from t;