【问题标题】:How to get min value from multiple columns for a row in SQL如何从SQL中的一行的多列中获取最小值
【发布时间】:2017-07-20 21:17:16
【问题描述】:

我需要从一组 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 .. 等等

【问题讨论】:

  • 列数据类型?
  • 您需要获取每一行的最小值,还是所有行的最小值?
  • 你的表中有任何 id 或主键列吗?
  • 使用标量函数你可以这样尝试 - SELECT ID, (SELECT MIN([date]) FROM (VALUES(Date1),(Date2),(Dateblah)) x([date])) MinDate FROM 表名;不确定这是否适用于 dashdb

标签: sql dashdb


【解决方案1】:

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

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(s) 为空,那么您可以将输出硬编码为 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

【讨论】:

  • 嗨,谢谢,这几乎可以完美运行。唯一的问题是,当所有列都为 NULL 时,我得到 01/01/2910 ...我宁愿只得到一个 NULL 值。有什么想法吗?
【解决方案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;

【讨论】:

  • 喜欢union all 的触摸,有利于性能。 :-)
【解决方案3】:

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

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

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

【讨论】:

  • 您好,“如果日期安排妥当”是什么意思?您的意思是 col1 必须在 col2 之前还是必须为 null 并且 col2 必须在 col3 之前或必须为 NULL ...等等?如果是这样,那么,不。列不按顺序>
  • @MikePala 。 . .该问题使用短语“第一个(最小)日期”。这让我认为日期是有序的。
【解决方案4】:
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 列或更多列编写相同的方式。

【讨论】:

  • @Mikhail 我已经编辑了答案,包括空值。
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多