我想设计一个查询,以找出至少有一只猫(选择计数(*),其中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这样的服务层中处理它,但只是想知道任何解决方案可以在查询中设计并且当表中有大量数据时良好性能 (签入和签出是索引但不是类型)
答案 0 :(得分:0)
这个怎么样?
Select *
From schedule
Where type='cat' and checkin=(select max(checkin) from schedule where type='cat' and checkout is null);
答案 1 :(得分:0)
假设checkin
和checkout
数据类型是字符串(它不应该是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