我正在尝试为表中的多个列计算平均值,并且试图基于where子句强加规则以计算该平均值。由于我在大多数这些列上没有不同的值,因此我无法执行group by子句来获得正确的结果。具有所有条件的简单where子句不能正确计算平均值。是否有解决此问题的方法?
我的桌子看起来像
col1 col2 col3 col4
0 -3 0 109
3 2 -1 -108
-4 -1 3 3
2 0 4 2
2 1 107 -2
我的目的是基于规则为每一列计算平均值。对于ex:avg(col1)应该包含0到100之间的值,avg(col2)应该包含-1到-100之间的值,avg(col3)应该包含0到100之间的值, avg(col4)的值应介于-1至-100之间。
select avg(col1), avg(col2), avg(col3), avg(col4) from tbl1
where (col1 between 0 and 100) and (col1 between -1 and -100) and (col3 between 0 and 100) and (col4 between -1 and -100)
答案 0 :(得分:1)
以下解决方案应该可以实现您的目标。首先,我们使用一些CTE(子查询)将列中的值限制为所需的值,然后获得其平均值。
WITH
first_col AS
(
SELECT col1
FROM the_table
WHERE col1 >= 0 and col1 <= 100
),
second_col AS
(
SELECT col2
FROM the_table
WHERE col2 >= -100 and col2 <= -1
),
third_col AS
(
SELECT col3
FROM the_table
WHERE col3 >= 0 and col3 <= 100
),
fourth_col AS
(
SELECT col4
FROM the_table
WHERE col4 >= -100 and col4 <= -1
)
SELECT
AVG(first_col.col1),
AVG(second_col.col2),
AVG(third_col.col3),
AVG(fourth_col.col4)
FROM
first_col,
second_col,
third_col,
fourth_col
您可以查看this SQL FIDDLE的结果。
1 -2 2 -2
或者,您可以使用此查询来避免使用CTE
SELECT
AVG(CASE WHEN col1 >= 0 AND col1 <= 100 THEN col1 END) AS col1avg,
AVG(CASE WHEN col2 >= -100 AND col2 <= -1 THEN col2 END) AS col2avg,
AVG(CASE WHEN col3 >= 0 AND col3 <= 100 THEN col3 END) AS col3avg,
AVG(CASE WHEN col4 >= -100 AND col4 <= -1 THEN col4 END) AS col4avg
FROM
the_table
您可以在this SQL FIDDLE
上查看结果1 -2 2 -2
BETWEEN
语句是包含在内的,因此确实假定您希望包含这些值。