SQL选择MAX值或NULL

时间:2013-12-27 16:29:39

标签: sql oracle

我有一个简单的表T1,它有Schema

T1 (id NUMBER, val VARCHAR2(10), dat DATE)

考虑到dat可以是NULL

我想执行查询以选择特定MAX(dat)

val

NULL如果dat = NULL

的行有val的话

例如:

id    val    dat
--    ---    ---
1      a     12-NOV-13
2      b     23-MAY-13
3      b     26-JAN-14
4      a     NULL

查询应返回NULL WHERE val = a

查询应返回26-JAN-14 WHERE val = b

是否可以在简单的SELECT查询中使用?

提前致谢。

5 个答案:

答案 0 :(得分:3)

您可以尝试选择所需内容,不包括重复内容,然后执行联合,类似于此;

SELECT VAL, MAX(DAT) FROM T1 
WHERE VAL NOT IN (select VAL from T1 where DAT is NULL GROUP BY VAL, DAT)
GROUP BY VAL, DAT
UNION
select VAL, DAT from T1 where DAT is NULL GROUP BY VAL, DAT

答案 1 :(得分:1)

如果我是你,我会在特定条件下使用if子句 this links is useful

IF dat <= 0 THEN
    returnValue := null;

ELSE
    returnValue := Max(dat);

END IF;

RETURN returnValue;

答案 2 :(得分:1)

我认为这应该有用

select * from (
select val,row_number() over (partition by val   order by  dat DESC nulls first) as row_num
from T1
) A
where row_num=1

答案 3 :(得分:1)

SELECT val, dat
  FROM (SELECT val,
               RANK () OVER (PARTITION BY val ORDER BY dat DESC NULLS FIRST)
                  rn,
               dat
          FROM t1)
 WHERE rn = 1;

答案 4 :(得分:0)

如果你想要每行的值,你可以使用分析函数来做到这一点:

select t1.*,
       (case when count(*) over (partition by val) = count(dat) over (partition by val)
             then max(dat) over (partition by val)
        end) as StrangeMaxDate
from t1;

如果您只想将此作为聚合,请使用相同的想法:

select val,
       (case when count(*) = count(dat) then max(dat) end) as StrangeMaxVal
from t1
group by val;