SQL:计数值高于组的平均值

时间:2015-06-25 14:16:55

标签: sql average

如何使用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.

4 个答案:

答案 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进行比较,而不是54

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 |