如何识别每行具有最大值的列
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
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;
我有一个 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
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;