我的数据库中有一个值列表。
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
得到一个:
“无效使用组功能”
我当时认为这是一个很常见的任务,但是我无法从文档中找到任何想法。
谢谢您的建议。
答案 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
答案 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 |