AND语句中的逻辑

时间:2012-12-03 21:42:11

标签: sql postgresql operator-precedence

我有这个查询来提取我可用于某些分析的数据:


SELECT   distinct egauge_analyze_2.dataid,     
date_trunc('hour', egauge_analyze_2.timestamp_localtime)::time AS HOUR, 
avg(egauge_analyze_2.use) AS USE   

FROM   dev.egauge_analyze_2

WHERE egauge_analyze_2.timestamp_localtime BETWEEN
       '2012-07-16 00:00:00' AND '2012-08-17 23:59:59' 

AND egauge_analyze_2.use IS NOT NULL

-- AND use > 0

GROUP BY 1,2 
ORDER BY 1,2

当我将它与上面的(原样)一起使用时,它为我提供了良好的数据,并且当我添加使用>的额外约束时,随时抛出任何具有空值的数据集(及其所有数据)。 0,它停止抛出dataid将为null值。

数据由dataids(唯一设备的值),时间戳和USE(当时该设备的功耗)组成 - 我正在尝试获取设备的季节性配置文件,但丢弃整个设备给定空或错误(负)数据。

我希望它删除任何使用值为null或< = 0的所有dataids(及其所有数据)。想法?

1 个答案:

答案 0 :(得分:0)

有点难以理解你的问题。我想你想要消除所有dataid个{NULL}为负的use值。您可以使用having子句执行此操作:

SELECT ea.dataid,     
       date_trunc('hour', ea.timestamp_localtime)::time AS HOUR, 
       avg(ea.use) AS USE   
FROM dev.egauge_analyze_2 ea
WHERE ea.timestamp_localtime BETWEEN '2012-07-16 00:00:00' AND '2012-08-17 23:59:59'
GROUP BY 1,2
having sum(case when use is null or use < 0 then 1 else 0 end) > 0
ORDER BY 1,2

此外,我删除了distinct子句中的select,因为没有必要(您有group by)。我还给表提供了一个更易读的别名ea,而不是表名。