繁体   English   中英

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

[英]PostgreSQL: find minimum value across multiple columns but return column name

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

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

例如,使用下表中的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

对于每一行,我想找出哪一列的正值最低。 我预期的 output 是这样的:

  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...吗? 我应该先将行转换为数组,然后分配数组中的每个 position 吗?

你可以做:

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

但是,此解决方案没有考虑多个最小值; 第一个(从左到右)获胜。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM