我需要从一组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 ..等等
答案 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或更多列。