2016-07-13 4 views
1

私は、列の最初のレコードから3/4/5レコードごとに平均を出すことにこだわっています。私は、データを持つテーブルを持っている場合は、我々はすべての3つのレコードの平均を言うならば、必要な出力がMS Access/SQLの最初のレコードから列の3つのレコードの平均を取得するにはどうすればよいですか?

every_three_records_average_Column 
    none 
    none 
    average(1.5, 2, 2.5) 
    average(2, 2.5, 3) 
    average(2.5, 3, 3.5) 
    average(3, 3.5, 4) 
    average(3.5, 4, 4.5) 
    average(4, 4.5, 5) 
    average(4.5, 5, 5.5) 
    average(5, 5.5, 6) 

ある

ID_Col1 | Value_Col2 
1  | 1.5 
2  | 2 
3  | 2.5 
4  | 3 
5  | 3.5 
6  | 4 
7  | 4.5 
8  | 5 
9  | 5.5 
10  | 6 

を言う誰もがSQLクエリで出力のこの種を取得するための任意のアイデアを持っています。

ご協力いただければ幸いです。

おかげで、 ハニー

+2

アクセスまたはMYSQL?任意のカードを1枚選ぶ! – RiggsFolly

+0

@ RiggsFolly-MS-Access – honey

+0

私はそれがMySQLであることを知っていますが、うまくいけば、これは[ここ]を助けることができます(http://stackoverflow.com/questions/21642329/get-average-value-for-each-x-rows-in- SQL) – CodyMR

答えて

1

SQL Fiddle Demo

SELECT 
    T1.[ID_Col1], T2.[ID_Col1], T3.[ID_Col1], 
    T1.[Value_Col2] , T2.[Value_Col2] , T3.[Value_Col2], 
    (T1.[Value_Col2] + T2.[Value_Col2] + T3.[Value_Col2])/3 

FROM Source T1 
JOIN Source T2 
    ON T1.[ID_Col1] = T2.[ID_Col1] - 1 
JOIN Source T3 
    ON T2.[ID_Col1] = T3.[ID_Col1] - 1 

OUTPUT

enter image description here

1
SELECT 
(
    SELECT Avg(A.Value_Col2) As Result 
    FROM myTable As A 
    WHERE A.ID_Col1 >= C.ID_Col1 and A.ID_Col1 < C.ID_Col1 + [MyParam] 
) 
FROM myTable As C 
WHERE C.ID_Col1 + [MyParam] -1 <= (SELECT MAX (D.ID_Col1) From myTable As D) 

説明:

  • 外部クエリ:mytableCの各レコードに対してMyParam(3、4、または問題の5)、最後のレコードbefor 記録まで。
    where句のクエリで表される:FROM myTable As C WHERE C.ID_Col1 + [MyParam] -1 <= (SELECT MAX (D.ID_Col1) From myTable As D)
  • インナークエリ:計算平均Value_Col2MyParamのレコードを、現在のレコードを開始します。 C.ID_Col1現在 IDであること、そして、それ以上[MyParam]超えるレコードとして、WHERE A.ID_Col1 >= C.ID_Col1A.ID_Col1 < C.ID_Col1 + [MyParam]SELECT Avg(A.Value_Col2)Where句の:
    Representd Select声明インチ

テスト

MyTable: 
ID_Col1 Value_Col2 
1  1.5 
2  2 
3  2.5 
4  3 
5  3.5 
6  4 
7  4.5 
8  5 
9  5.5 
10  6 
11  6.5 
12  7 
13  7.5 
14  8 
15  8.5 
16  9 
17  9.5 

結果MyParam = 3

Result 
2 
2.5 
3 
3.5 
4 
4.5 
5 
5.5 
6 
6.5 
7 
7.5 
8 
8.5 
9 

結果ためMyParam = 5

Result 
2.5 
3 
3.5 
4 
4.5 
5 
5.5 
6 
6.5 
7 
7.5 
8 
8.5 
ため
+1

OK、テストしましたが、ちょっと修正しました、今はうまくいきます;) – marlan

+0

@honey - あなたの質問にうまく答えられませんでしたか? – marlan

1

は、過去3つのIDに相関集計サブクエリフィルタリングを考えてみましょう:

SELECT myTable.ID_Col1, myTable.Value_Col2, 

     (SELECT Avg(sub.Value_Col2) 
     FROM myTable As sub 
     WHERE sub.ID_Col1 >= myTable.ID_Col1 - 2 
     AND sub.ID_Col1 <= myTable.ID_Col1 
     AND myTable.ID_Col1 >= 3) As LastThreeAvg 

FROM myTable; 

出力が

ID_Col1 Value_Col2 LastThreeAvg 
1   1.5  
2   2  
3   2.5   2 
4   3   2.5 
5   3.5   3 
6   4   3.5 
7   4.5   4 
8   5   4.5 
9   5.5   5 
10  6   5.5 

ID_Col1は、オートナンバー型のフィールドがある場合は、保証値が数値序数に残らないがあります。したがって、派生テーブルと集約サブクエリの両方で計算された行番号RowNoが必要です。 CTEのないMS Access SQLでは、クエリは少し冗長になります。

SELECT dT.ID_Col1, dT.Value_Col2, 

     (SELECT Avg(sub.Value_Col2) 
     FROM 
      (SELECT ID_Col1, Value_Col2, 
        (SELECT Count(*) 
         FROM myTable As sub 
         WHERE sub.ID_Col1 <= myTable.ID_Col1) As RowNo 
      FROM myTable) As sub 
     WHERE sub.RowNo >= dT.RowNo - 2 
     AND sub.RowNo <= dT.RowNo 
     AND sub.RowNo >= 3) As LastThreeAvg 
FROM 

(SELECT ID_Col1, Value_Col2, 
     (SELECT Count(*) 
     FROM myTable As sub 
     WHERE sub.ID_Col1 <= myTable.ID_Col1) As RowNo 
FROM myTable) As dT 
関連する問題