我有以下查询返回
Rate
------
4
6
8
SELECT Rate FROM t_Vote
EXCEPT
SELECT MAX(Rate) FROM t_Vote
EXCEPT
SELECT MIN(Rate) FROM t_Vote
我的目标是获得这3个数字的平均值,因此我只需要用SELECT Rate
替换第一个SELECT AVG(Rate)
。但是,使用SELECT AVG(Rate)
得到的值 5 不是 6 ,而是 5 。为什么这样?当我尝试SELECT AVG(CAST(Rate AS FLOAT))
时,它不考虑EXCEPT条件。我错过了什么?
答案 0 :(得分:4)
我的目标是获得这3个数字的平均值,所以我只需用SELECT AVG(速率)替换第一个SELECT速率
你应该这样做
:with cte(n)
as
(
SELECT Rate FROM t_Vote
EXCEPT
SELECT MAX(Rate) FROM t_Vote
EXCEPT
SELECT MIN(Rate) FROM t_Vote
)
select avg(n) from cte
答案 1 :(得分:2)
EXCEPT
解决方案会在计算平均值之前删除重复项!
只需手动删除最大值和最小值,然后计算平均值:
select (sum(Rate) - max(Rate) - min(Rate)) / (count(Rate) - 2)
from t_Vote
警告:只有在表格中至少有3行才有效!
也许你需要将总和乘以1.0得到浮动结果? (某些dbms产品需要,但其他人不需要。)
答案 2 :(得分:0)
如果你只需要平均值。您只需要运行以下查询。
SELECT AVG(Rate) from t_vote
没有必要写其他两行有EXCEPT的行。我测试了上面的场景,它在我的机器上运行正常(SQL 2008)。现在问题可能是表中还有其他记录,您不希望包括在平均值计算中,如0,最大值或最小值。如果是这样,请确保排除这些值,如下所示。在下面的例子中,我只是排除了最大值和最小值。
Select AVG(Rate) from (
SELECT Rate from t_vote
EXCEPT
SELECT MAX(Rate) FROM t_Vote
EXCEPT
SELECT MIN(Rate) FROM t_Vote
)a