是否可以将表中的每条记录与查询中其他记录的平均值进行比较

时间:2013-04-12 19:34:35

标签: mysql sql

对于MySQL中的表,我有两列

col1   col2
  1     4.5
  1     4.8
  1     4.4
  1     3.9
  1     7.6
  1     4.5
  2     2.9
  2     4.8
  2     5.6
  2     4.5
  3     8.9
  3     9.7
  3     7.8
  3     8.2
  3     4.3

我想做的是

  1. 计算col1的不同值的col2的平均值,这很容易
  2. SELECT col1,AVG(col2)FROM mytable GROUP BY col1

    1   4.95
    2   4.45
    3   7.78
    

    2。如果col2值小于col1值的平均值,则col1值等于col1-1,选择记录。我无法弄清楚这一部分:

     SELECT col1,col2 FROM mytable WHERE col2<AVG(col2 where col1= current col1-1)
    

    结果集应为:

    2   2.9
    2   4.8
    2   4.5
    3   4.3
    

    由于col1 = 0没有记录,因此col1 = 1

    没有记录

2 个答案:

答案 0 :(得分:4)

试试这个:

SELECT t1.*
FROM @yourtable AS t1
INNER JOIN
(
   SELECT col1, AVG(col2) col2avg
   FROM @yourtable
   GROUP BY col1
) AS t2  ON t1.col1 - 1 = t2.col1
        AND t1.col2 < t2.col2avg;

答案 1 :(得分:1)

拥有子句和自我加入可以让你这样做

Select a.col1, a.col2, 
   Avg(b.Col2) AvgCol2
From yourTable a
   Join yourTable b 
       On b.col1 = a.col1 - 1     
Group By a.col1, a.col2
Having a.col2 < Avg(b.Col2)

对于您的样本数据,例如,它会返回

col1     col2     AvgCol2
-------- -------- --------
2        2.9      4.95
3        4.3      4.45
2        4.5      4.95
2        4.8      4.95

说明:   考虑这一点的一种方法是Having是用于过滤在Group By查询中聚合后构造的结果集的子句,而Where子句是仅在聚合之前构建的临时结果集的过滤器(或在排序之前)在非分组查询中。