PostgreSQL:在多个列中查找最小值,但返回列名



对于表中的每一行,我想在几个数字列中找到最小值,然后取该列的名称(包含所需值(,并用名称(或自定义字符串(填充列。

在我的特定场景中,首先有几个规则:要在列中找到的值也必须>此外,如果该列中没有值>0,则应放置一个自定义字符串(即"none"(。

例如,取下表,其中列alphadelta存储值:

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

然而,这个解决方案没有考虑到多个最小值;第一个(从左到右(获胜。

相关内容

  • 没有找到相关文章

最新更新