【问题标题】:SQL: Count values higher than average for a groupSQL:计数值高于组的平均值
【发布时间】:2015-09-12 05:09:10
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个 rdbms?
  • 我在使用 microsoft sql 和 sql management studio
  • 它的值是否严格高于平均值?所以一组1,2,3(平均2)只报告1个值,3?
  • 是的,它严格来说更高,应该返回高于平均值的值的数量

标签: sql average


【解决方案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

【讨论】:

    【解决方案2】:

    我的答案与其他答案非常相似,除了平均值是通过将乘法与1.0 相加来计算的。

    这对值没有负面影响,但会进行从整数到浮点值的隐式转换,以便第一组使用5.25 进行比较,第二组使用3.5 而不是@987654325分别是@和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)。

    【讨论】:

      【解决方案3】:

      试试这个:

       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
      

      在子查询中,您将计算两个组的平均值,将其加入您的表中,然后您将从表中选择值大于平均值的所有值的计数

      【讨论】:

        【解决方案4】:

        你可以像这样使用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 |
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-25
          • 1970-01-01
          • 2017-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多