非常特殊的AVG声明

时间:2014-06-30 17:24:54

标签: sql postgresql

表示例:

time  a  b  c
-------------
12:00  1  0  1
12:00  2  3  1
13:00  3  2  1
13:00  3  3  3
14:00  1  1  1

如何从按时间分组的行AVG(a)WHERE b!=0获取AVG(c)。是否可以仅使用sql来解决?我的意思是查询不应该计算第一行来获取AVG(a),但不能计算AVG(c)

3 个答案:

答案 0 :(得分:2)

您可以使用CASE语句来获取条件聚合:

SELECT AVG(CASE WHEN b != 0 THEN a END)
      ,AVG(c)
FROM YourTable
GROUP BY time

演示:SQL Fiddle

这是有效的,因为WHEN语句中CASE条件未捕获的值将默认为NULL,并且聚合函数会忽略NULL值。

答案 1 :(得分:0)

SELECT AVG(a), AVG(c) from table WHERE b != 0
group by time

是啊......这就是你需要的吗?

答案 2 :(得分:0)

您可能想尝试类似

的内容
SELECT T.tTIME
, AVG(CASE WHEN T.B != 0 THEN T.A END)
, AVG(T.C)

FROM @T T


GROUP BY T.tTIME

输出如下:

tTIME   (No column name)    (No column name)
12:00:00.0000000    2   1
13:00:00.0000000    3   2
14:00:00.0000000    1   1