MySQL-选择列表的平均值,但忽略最大值和最小值

时间:2019-08-07 12:43:49

标签: mysql average

我的数据库中有一个值列表。

k v
1 5000
1 100
1 120
1 3
2 5000
2 100
2 120
2 4
3 10000
3 120
3 100
3 4
4 10
4 120
4 110
4 5000

我想计算每个k的平均值,但是我需要忽略每个k的v的最大值和最小值。 (以消除尖峰)

select avg(v) from table where v > min(v) and v < max(v) group by k

得到一个:

  

“无效使用组功能”

我当时认为这是一个很常见的任务,但是我无法从文档中找到任何想法。

谢谢您的建议。

4 个答案:

答案 0 :(得分:0)

select avg(v) , k 
from table 
group by k  
    having k <> min (v) and k<> max (v)

答案 1 :(得分:0)

一种执行此操作而不必担心v的最小值和最大值是否重复的方法(假设您只想忽略其中的一个)是将平均值取为SUM(v)/COUNT(v),但减去计算中的最小值和最大值:

SELECT k, (SUM(v) - MAX(v) - MIN(v)) / (COUNT(v) - 2) AS average
FROM data
GROUP BY k

输出:

k   average
1   110
2   110
3   110
4   115

Demo on dbfiddle

答案 2 :(得分:0)

链接: Demo

select t1.k, avg(t1.v) average
from numbers t1 left join (
  select k, min(v) minv, max(v) maxv
  from numbers 
  group by k
) t2 on t2.k = t1.k and t1.v in (t2.minv, t2.maxv)
where t2.k is null
group by t1.k

答案 3 :(得分:0)

首先获取每个v的最小值{max}和最大值k,然后将left join表格作为结果,以获取不匹配行的平均值:

select
  t.k, avg(t.v) average
from tablename t left join (
  select k, min(v) minv, max(v) maxv
  from tablename
  group by k
) g on g.k = t.k and t.v in (g.minv, g.maxv)
where g.k is null
group by t.k

请参见demo
结果:

| k   | average |
| --- | ------- |
| 1   | 110     |
| 2   | 110     |
| 3   | 110     |
| 4   | 115     |