如何从查询结果中排除最近的空字段?

时间:2016-11-06 04:25:39

标签: sql oracle

我想设计一个查询,以找出至少有一只猫(选择计数(*),其中rownum = 1)尚未检出。

一个奇怪的情况是,如果最近的猫未检出,结果应该排除,以便:

TABLE schedule
-------------------------------------
|  type | checkin  |  checkout
-------------------------------------
|  cat  |  20:10  |   (null)
|  dog  |  19:35  |   (null)
|  dog  |  19:35  |   (null)
|  cat  |  15:31  |   (null)   ----> exclude this cat in this scenario
|  dog  |  12:47  |   13:17
|  dog  |  10:12  |   12:45
|  cat  |  08:27  |   11:36

应该返回1,第一条记录

|  cat  |  20:10  |   (null)

我有点像

那样创建查询
select * from schedule where type = 'cat' and checkout is null order by checkin desc

但是此查询不能解决排除问题。我可以肯定在像java这样的服务层中处理它,但只是想知道任何解决方案可以在查询中设计并且当表中有大量数据良好性能 (签入和签出是索引但不是类型)

2 个答案:

答案 0 :(得分:0)

这个怎么样?

Select *
From schedule
Where type='cat' and checkin=(select max(checkin) from schedule where type='cat' and checkout is null);

答案 1 :(得分:0)

假设checkincheckout数据类型是字符串(它不应该是DATE),to_char(checkin, 'hh24:mi')将创建正确数据类型的值,DATE ,假设当月的第一天为“日期”部分。这对你来说无关紧要,因为大概所有时间都来自同一天。如果实际上checkin/out属于正确的DATE数据类型,则您不需要在to_date()中进行order by调用(在两个地方)。

我从输出中遗漏了checkout列,因为您只在该列中查找null行,因此包含它将不提供任何信息。我也会遗漏type,但也许你以后会想要为猫狗准备这个......

with
     schedule( type, checkin, checkout ) as (
       select 'cat', '20:10', null    from dual union all
       select 'dog', '19:35', null    from dual union all
       select 'dog', '19:35', null    from dual union all
       select 'cat', '15:31', null    from dual union all
       select 'dog', '12:47', '13:17' from dual union all
       select 'dog', '10:12', '12:45' from dual union all
       select 'cat', '08:27', '11:36' from dual
     )
-- end of test data; actual solution (SQL query) begins below this line
select type, checkin
from   ( select type, checkin, 
                row_number() over (order by to_date(checkin, 'hh24:mi')) as rn
         from   schedule
         where  type = 'cat' and checkout is null
       )
where  rn > 1
order by to_date(checkin, 'hh24:mi')   --  ORDER BY is optional
;

TYPE  CHECKIN
----  -------
cat   20:10