【问题标题】:Logic to use in place of Aggregate function the WHERE clause使用 WHERE 子句代替聚合函数的逻辑
【发布时间】:2020-07-02 19:28:08
【问题描述】:
我正在计算一个大表中值的频率。由于聚合函数的结果导致某些行为零,我想简单地跳过这些行。我本可以使用NULLIF(..),但我不想返回零值。 WHERE 子句中不允许使用聚合函数。如何重构我的查询以跳过这些行?
SELECT device_id,
COUNT(*) / (MAX(signal_strength) - MIN(signal_strength)) as freq
FROMm dcu
WHERE MAX(signal_strength) - MIN(signal_strength) !=0
GROUP BY device_id
ERROR: aggregate functions are not allowed in WHERE
LINE 4: where max(signal_strength) - min(signal_strength) !=0
【问题讨论】:
标签:
sql
postgresql
aggregate-functions
【解决方案1】:
您必须使用HAVING 而不是WHERE 进行聚合计算。例如:
SELECT device_id,
COUNT(*) / (MAX(signal_strength) - MIN(signal_strength)) as freq
FROMm dcu
GROUP BY device_id
HAVING MAX(signal_strength) <> MIN(signal_strength)
【解决方案2】:
使用聚合函数,你不能使用where clause - 你需要使用having clause
SELECT device_id,
COUNT(*) / (MAX(signal_strength) - MIN(signal_strength)) as freq
FROMm dcu
GROUP BY device_id
having MAX(signal_strength) - MIN(signal_strength) !=0