如何使用SQL来计算高于组平均值的值?
例如:
我的表格A
包含:
q t
1 5
1 6
1 2
1 8
2 6
2 4
2 3
2 1
第1组的平均值为5.25。组中有两个值高于5.25,分别为8和6;因此,该组的高于平均值的计数为2.
第2组的平均值为3.5。组中有两个值高于3.5,分别为5和6;因此,该组的高于平均值的计数为2.
答案 0 :(得分:2)
试试这个:
select count (*) as countHigher,a.q from yourtable a join
(select AVG(t) as AvgT,q from yourtable a group by q) b on a.q=b.q
where a.t > b.AvgT
group by a.q
在子查询中,您将计算两个组的平均值,将其加入到您的表中,然后您将从表中选择所有值的计数,其中值大于平均值
答案 1 :(得分:1)
我的答案与其他答案非常相似,只是通过将乘法与1.0
相加,使用十进制值计算平均值。
这对值没有负面影响,但会从整数到浮点值进行隐式转换,以便第一组5.25
与第二组3.5
进行比较,而不是5
和4
。
SELECT count(test.q) GroupCount
,test.q Q
FROM test
INNER JOIN (
SELECT q
,avg(t * 1.0) averageValue
FROM test
GROUP BY q
) result ON test.q = result.q
WHERE test.t > result.averageValue
GROUP BY test.q
这是working SQLFiddle of this code。
此查询应适用于最常见的RDBMS系统(SQL Server,Oracle,Postgres)。
答案 2 :(得分:1)
这也应该有效:
SELECT t1.name, COUNT(t1.value)
FROM table t1
WHERE t1.value >
(SELECT AVG(value) FROM table t2
WHERE t1.name=t2.name)
GROUP BY t1.name
答案 3 :(得分:0)
您可以像这样使用AVG(t) OVER(PARTITION BY)
。的 SQL Fiddle 强>
<强>查询强>
SELECT COUNT(*)OVER(PARTITION BY q) overcount,q,t
FROM
(
SELECT q,t,AVG(t)OVER(PARTITION BY q) grp_avg FROM o
)C
WHERE t > grp_avg;
<强>输出强>
| overcount | q | t |
|-----------|---|---|
| 2 | 1 | 6 |
| 2 | 1 | 8 |
| 2 | 2 | 6 |
| 2 | 2 | 4 |