Sql 选择在特定时间窗口中具有所有空值的记录

Sql 选择在特定时间窗口中具有所有空值的记录,sql,oracle,Sql,Oracle,我有这张桌子: CODE | INSTANT | VAL 在时间窗口内,基于即时列值,VAL可以为null或不为null。 所以你可以有这样的东西: 'A',2015-06-29 08:00:01,null 'A',2015-06-29 08:30:01,5 'A',2015-06-29 09:00:00,null 'B',2015-06-29 08:00:01,null 'B',2015-06-29 08:30:01,null 'B',2015-06-29 09:00:00,null se

我有这张桌子:

CODE | INSTANT | VAL
在时间窗口内,基于即时列值,VAL可以为null或不为null。 所以你可以有这样的东西:

'A',2015-06-29 08:00:01,null
'A',2015-06-29 08:30:01,5
'A',2015-06-29 09:00:00,null
'B',2015-06-29 08:00:01,null
'B',2015-06-29 08:30:01,null
'B',2015-06-29 09:00:00,null
select t.code
from table t
where t.instant >= WINDOW_START and
      t.instant <= WINDOW_END
group by t.code
having max(val) is null;
现在,考虑到时间窗口:

2015-06-29 08:00:00 <--> 2015-06-29 09:00:00
2015-06-29 08:00:00 2015-06-29 09:00:00

我想获得在该时间窗口中ALLnull的记录代码。在本例中,答案仅为“B”,因为代码为“A”的记录在指定的时间窗口中至少有一个条目5不是空的。

如果我理解正确,您希望在一定的值范围内记录的所有代码都是空的。如果是这样,那么您可以使用聚合和
having
子句,如下所示:

'A',2015-06-29 08:00:01,null
'A',2015-06-29 08:30:01,5
'A',2015-06-29 09:00:00,null
'B',2015-06-29 08:00:01,null
'B',2015-06-29 08:30:01,null
'B',2015-06-29 09:00:00,null
select t.code
from table t
where t.instant >= WINDOW_START and
      t.instant <= WINDOW_END
group by t.code
having max(val) is null;

对于给定的日期范围,对于没有VAL的代码,这应该只为您提供一条记录

SELECT DISTINCT
    CODE
FROM
    table1 t1
WHERE
    NOT EXISTS ( SELECT
                    1
                 FROM
                    table1 t2
                 WHERE
                    t1.CODE = t2.CODE               
                    AND t2.VAL IS NOT NULL
                    AND INSTANT BETWEEN '2015-06-29 09:00:00'
                                AND     '2015-06-29 09:00:00' )

谢谢,这真是一个干净的查询,而且似乎有可接受的性能。