为具有多列的每一行选择最小值和最大值

时间:2014-10-07 12:22:24

标签: mysql sql

我试图运行一个查询来选择每行的最小值和最大值,包含多列。

以下是我尝试从中选择的一些数据 -

ITEM NO IDN IDB     IDC     IDE    IDF  IDG     IDH
A33     1.5  1.25    5      14.5   1.89 1.254   1.21
A34     1.6  1.257   5.95   52.1   1.2  1.256   1.235

我需要的最终结果是 -

ITEM NO     MIN   MAX
A33         1.2   14.5
A34         1.2   52.1

在sql查询中有没有简单的方法呢?

1 个答案:

答案 0 :(得分:6)

假设您没有NULL个值(如示例数据中所示),请使用least()greatest()

select item_no, least(idn, idb, idc, ide, idf, idg, idh) as `min`, 
       greatest(idn, idb, idc, ide, idf, idg, idh) as `max`
from table t;

编辑:

使用NULL值时,这会变得更加困难。一种方法是,如果你可以定义一个有效的范围,那么这样的工作:

select item_no,
       least(coalesce(idn, 999999999), coalesce(idb, 999999999), coalesce(idc, 999999999), coalesce(ide, 999999999), 
             coalesce(idf, 999999999), coalesce(idg, 999999999), coalesce(idh, 999999999)
            ) as `min`, 
       greatest(coalesce(idn, -1), coalesce(idb, -1), coalesce(idc, -1), coalesce(ide, -1), 
                coalesce(idf, -1), coalesce(idg, -1), coalesce(idh, -1)
               ) as `max`
from table t;

如果行中的所有值都为NULL,您可以使用case逻辑或nullif()转换回NULL

select item_no,
       nullif(least(coalesce(idn, 999999999), coalesce(idb, 999999999), coalesce(idc, 999999999), coalesce(ide, 999999999), 
                    coalesce(idf, 999999999), coalesce(idg, 999999999), coalesce(idh, 999999999)
                   ),
              999999999) as `min`, 
       nullif(greatest(coalesce(idn, -1), coalesce(idb, -1), coalesce(idc, -1), coalesce(ide, -1), 
                       coalesce(idf, -1), coalesce(idg, -1), coalesce(idh, -1)
                      ),
              -1) as `max`
from table t;
相关问题