【问题标题】:Is it possible to compare each record in a table with the average values of other records in a query是否可以将表中的每条记录与查询中其他记录的平均值进行比较
【发布时间】:2013-04-12 19:34:34
【问题描述】:

对于 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 值小于 col1 等于 col1-1 的 col2 值的平均值,则选择该记录。我无法弄清楚这部分:

 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 将没有记录

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    试试这个:

    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;
    

    【讨论】:

    • 你和JW一起统治Sql星球
    • sqlfiddle 停止服务了吗?
    • 感谢 Mahmoud,但上面的代码给出了 '1', '4.4' '1', '3.9' '2', '2.9' '2', '4.8' '2', '5.6 ''2','4.5'
    • 嘿,Mahmoud,演示效果很好,我说它不起作用,因为您的答案中的代码在您的演示中最后缺少“AND t1.col2
    【解决方案2】:

    拥有子句和自连接允许您这样做

    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 子句是在聚合之前(或在非组中排序之前)构造的临时结果集的过滤器通过查询)。

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 2012-06-03
      • 1970-01-01
      • 2014-09-17
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      相关资源
      最近更新 更多