如何从SQL中的行的多列获取最小值

时间:2017-03-01 13:50:45

标签: sql dashdb

我需要从一组4个(或更多)列中获得第一个(最小)日期。

我试过

从tbl

中选择min(col1,col2,col3)

这显然是错误的。

让我说我有这4列

col1     |  col2     | col3  |  col4
1/1/17   | 2/2/17    |       | 3/3/17

...在这种情况下,我想得到的是col1(1/1/17)中的值。是的,这些列可以包含NULL。

我在dashDB中运行它

列是日期数据类型,

此表中没有ID或主键列,

我需要对查询中的所有行执行此操作,

列不按顺序排列。意味着col1不必在col2之前,或者它必须为null并且col2不必在col3之前或者它必须为NULL ..等等

4 个答案:

答案 0 :(得分:2)

如果表格中有id列。然后

<强>查询

select t.id, min(t.col) as min_col_value from(
    select id, col1 as col from your_table
    union all
    select id, col2 as col from your_table
    union all
    select id, col3 as col from your_table
    union all
    select id, col4 as col from your_table
)t
group by t.id;

答案 1 :(得分:2)

如果您的数据库支持最少的功能,那么这是最好的方法

select 

least 
(
nvl(col1,TO_DATE('2901-01-01','YYYY-MM-DD')),
nvl(col2,TO_DATE('2901-01-01','YYYY-MM-DD')),
nvl(col3,TO_DATE('2901-01-01','YYYY-MM-DD')),
nvl(col4,TO_DATE('2901-01-01','YYYY-MM-DD'))
)
from tbl

编辑:如果所有col都为空,则可以将输出硬编码为null。以下查询应该有效。我无法测试它,但这应该有效。

select 
case when 
    least 
    (
    nvl(col1,TO_DATE('2901-01-01','YYYY-MM-DD')),
    nvl(col2,TO_DATE('2901-01-01','YYYY-MM-DD')),
    nvl(col3,TO_DATE('2901-01-01','YYYY-MM-DD')),
    nvl(col4,TO_DATE('2901-01-01','YYYY-MM-DD'))
    ) 
    = TO_DATE('2901-01-01','YYYY-MM-DD') 
then null 
else 
    least 
(
nvl(col1,TO_DATE('2901-01-01','YYYY-MM-DD')),
nvl(col2,TO_DATE('2901-01-01','YYYY-MM-DD')),
nvl(col3,TO_DATE('2901-01-01','YYYY-MM-DD')),
nvl(col4,TO_DATE('2901-01-01','YYYY-MM-DD'))
) 
end 
as min_date
from tbl

答案 2 :(得分:1)

如果您想要第一个日期,请使用coalesce()

select coalesce(col1, col2, col3, col4)
from t;

这将返回第一个非NULL值(这是我解释问题的一种方式)。如果日期是有序的,这将是最短的日期。

答案 3 :(得分:0)

Select Id, CaseWhen (Col1 <= Col2 OR Col2 is null) And (Col1 <= Col3 OR Col3 is null) Then Col1 When (Col2 <= Col1 OR Col1 is null) And (Col2 <= Col3 OR Col3 is null) Then Col2 Else Col3 End As Min From YourTable 

这是3列,相同的方式你可以写4或更多列。