3

MySQL のテーブルの場合、2 つの列があります

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. col1 が col1-1 に等しい場合、その col2 値が 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 のレコードはありません。

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

説明: これについて考える 1 つの方法は、句はHaving、Group By クエリでの集計後に構築された結果セットをフィルター処理するための節であるのに対し、Where句は、集計の直前 (または非 Group By クエリでの並べ替えの前) に構築された一時的な結果セットのフィルターです。

于 2013-04-12T19:48:00.870 に答える