PostgreSQL:在多个列中找到最小值,但 return 列名
PostgreSQL: find minimum value across multiple columns but return column name
对于 table 中的每一行,我想在几个数字列中找到最小值,然后取该列的 name(其中包含所需的值)并使用名称(或自定义字符串)填充 new 列。
在我的特定场景中首先要遵循一些规则:跨列找到的值也必须 > 0。此外,如果列中没有值 > 0,则应放置自定义字符串(即。 'none').
例如,下面的 table 列 alpha
到 delta
存储值:
id | alpha | bravo | charlie | delta
------+--------+--------+---------+--------
1 | 5 | 2.3 | -1 | -5
2 | 9 | 8 | 3 | 1
3 | -1 | -4 | -7 | -9
4 | 6.1 | 4 | 3.9 | 0
对于每一行,我想找出哪一列的正值最小。我的预期输出是这样的:
id | alpha | bravo | charlie | delta | lowest_postive
------+--------+--------+---------+--------+---------------
1 | 5 | 2.3 | -1 | -5 | 'col: bravo'
2 | 9 | 8 | 3 | 1 | 'col: delta'
3 | -1 | -4 | -7 | -9 | 'col: none'
4 | 6.1 | 4 | 3.9 | 0 | 'col: charlie'
我应该使用 CASE ... WHEN ... THEN ...
吗?我应该先将行转换为数组,然后分配数组中的每个位置吗?
你可以这样做:
select *,
case when mp = alpha then 'col: alpha'
when mp = bravo then 'col: bravo'
when mp = charlie then 'col: charlie'
when mp = delta then 'col: delta'
end as lower_positive
from (
select *,
least(
case when alpha > 0 then alpha end,
case when bravo > 0 then bravo end,
case when charlie > 0 then charlie end,
case when delta > 0 then delta end
) as mp
from t
) x
但是,这个解决方案没有考虑多个最小值;第一个(从左到右)获胜。
对于 table 中的每一行,我想在几个数字列中找到最小值,然后取该列的 name(其中包含所需的值)并使用名称(或自定义字符串)填充 new 列。
在我的特定场景中首先要遵循一些规则:跨列找到的值也必须 > 0。此外,如果列中没有值 > 0,则应放置自定义字符串(即。 'none').
例如,下面的 table 列 alpha
到 delta
存储值:
id | alpha | bravo | charlie | delta
------+--------+--------+---------+--------
1 | 5 | 2.3 | -1 | -5
2 | 9 | 8 | 3 | 1
3 | -1 | -4 | -7 | -9
4 | 6.1 | 4 | 3.9 | 0
对于每一行,我想找出哪一列的正值最小。我的预期输出是这样的:
id | alpha | bravo | charlie | delta | lowest_postive
------+--------+--------+---------+--------+---------------
1 | 5 | 2.3 | -1 | -5 | 'col: bravo'
2 | 9 | 8 | 3 | 1 | 'col: delta'
3 | -1 | -4 | -7 | -9 | 'col: none'
4 | 6.1 | 4 | 3.9 | 0 | 'col: charlie'
我应该使用 CASE ... WHEN ... THEN ...
吗?我应该先将行转换为数组,然后分配数组中的每个位置吗?
你可以这样做:
select *,
case when mp = alpha then 'col: alpha'
when mp = bravo then 'col: bravo'
when mp = charlie then 'col: charlie'
when mp = delta then 'col: delta'
end as lower_positive
from (
select *,
least(
case when alpha > 0 then alpha end,
case when bravo > 0 then bravo end,
case when charlie > 0 then charlie end,
case when delta > 0 then delta end
) as mp
from t
) x
但是,这个解决方案没有考虑多个最小值;第一个(从左到右)获胜。