在oracle请求的条件

时间:2015-10-02 16:11:12

标签: sql database oracle select null

我有一个日期字段,在Oracle数据库中可以是null

我想选择日期最长的行。 但是如果只有一行null日期并且我使用max子句,它将被忽略。

SELECT val1, val2 
from T_DER 
WHERE DATE_AP = ( SELECT MAX (DATE_AP) FROM T_DER WHERE AE= 'XXX')
AND (AE= 'XXX');

所以,在这些情况下:

  • 表示AE = XXX =>第1行:DATE_AP = 01/01/2015和第2行:DATE_AP = 01/02/2016
    • 返回第2行
  • 表示AE = XXX =>第1行:DATE_AP = 01/01/2015和第2行:DATE_AP = null
    • 返回第1行
  • 表示AE = XXX =>第1行:DATE_AP = null
    • 返回第1行

2 个答案:

答案 0 :(得分:2)

使用分析函数:

SELECT t.*
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY AE ORDER BY DATE_AP DESC NULLS LAST) as seqnum
      FROM T_DER t
      WHERE AE = 'XXX'
     ) t
WHERE seqnum = 1;

ROW_NUMBER()是一个窗口/分析/排名函数,记录为here。基本上,它为行组分配一个序号,其中组由partition by子句定义,每组中的排序由order by定义。

答案 1 :(得分:1)

您没有指定您正在使用的Oracle版本。 Gordon Linoff的回答当然是正确的,应该适用于8i及以上的任何Oracle版本。

如果您使用的是Oracle 12c,那么实现此结果的方式会更为优雅:

SELECT   val1, val2 
FROM     t_der 
WHERE    ae = 'XXX'
ORDER BY date_ap DESC
FETCH    FIRST ROW ONLY