1

在此数据中 - 有多个与时间序列数据关联的 DATA_ID 值。我正在尝试从任何 DATA_ID 值中排除所有数据,这些值返回 NULL 值以用于任何时间戳值。

换句话说,如果 DATA_ID 值(及其数据)对于所有时间戳值都有完整(不是任何 NULL)值,我只想返回它们。

示例查询如下:

SELECT   
My.Table.DATA_ID,   
MY.Table.timestamp,   
My.Table.USE

FROM   
My.TABLE

WHERE timestamp BETWEEN '2012-06-01 00:00:00' AND '2012-06-02 23:59:59'

-- Something here that says exclude all data from DATA_ID(s)
-- with any missing USE data,   i.e. USE=NULL

ORDER BY DATA_ID, timestamp

4

2 回答 2

1

假设我正确理解了您的问题,并且您想要排除包含空值的整批样本(由相等的 data_id 和时间戳确定)。

SELECT   
My.Table.DATA_ID,
MY.Table.timestamp,
My.Table.USE

FROM
My.TABLE o

WHERE timestamp BETWEEN '2012-06-01 00:00:00' AND '2012-06-02 23:59:59'

and not exists (select 1 from my_table i
  where i.use is null
  and i.data_id = o.data_id
  and i.timestamp BETWEEN '2012-06-01 00:00:00' AND '2012-06-02 23:59:59')

ORDER BY DATA_ID, timestamp
于 2012-08-25T12:25:13.810 回答
0

简单的事情是这样的:

CREATE FUNCTION missing_info(MY.TABLE) 
RETURNS BOOL 
LANGUAGE SQL AS
$$ select $1.use is null -- chain conditions together with or. 
   -- no from clause needed.  no where clause needed.
$$;

然后你可以添加:

其中 (My.Table).missing_info 不正确;

由于您需要更改缺少哪些信息的逻辑,您只需在函数中更改它,一切仍然有效。

这是一种派生信息的封装,其中 ORDBMS 之类的 PostgreSQL 真正大放异彩。

编辑:重新阅读您的示例,看起来您正在寻找的是 IS NULL 运算符。但是,如果您需要重用某种逻辑,请参阅上面的示例。NULL 从不“等于” NULL(因为我们不能说两个未知值是否相同)。但是 IS NULL 会告诉您它是否为 NULL。

于 2012-08-25T10:11:34.290 回答