3

对于 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 的平均值,这很容易

SELECT col1,AVG(col2) FROM mytable GROUP BY col1

1   4.95
2   4.45
3   7.78

2. 如果 col2 值小于 col2 值的平均值,则选择该记录,其中 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 将没有记录

4

2 回答 2

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;
于 2013-04-12T19:37:15.420 回答
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子句是在聚合之前(或在非 Group By 查询中排序之前)构造的临时结果集的过滤器。

于 2013-04-12T19:48:00.870 回答