2016-07-13 18 views
1

Ich arbeite an etwas, wo ich festhalte den Durchschnitt von sagen alle drei/vier/fünf Datensätze beginnend mit dem ersten Datensatz in einer Spalte. Wenn ich habe eine Tabelle mit DatenWie erhält man den Durchschnitt aller drei Datensätze in einer Spalte, beginnend mit dem ersten Datensatz in MS Access/SQL?

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 

sagen, wenn wir sagen, durchschnittlich alle drei Datensätze dann benötigt die Ausgabe ist

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) 

Hat jemand eine Idee, diese Art von Ausgabe in SQL-Abfrage zu erhalten.

Jede Hilfe würde sehr geschätzt werden.

Danke, Honig

+2

Zugriff oder MYSQL? Wähle eine Karte aus! – RiggsFolly

+0

@ RiggsFolly-MS-Access – honey

+0

Ich weiß, es ist MySQL, aber hoffentlich kann dies [hier] helfen (http://stackoverflow.com/questions/21642329/get-average-value-for-each-x-rows-in- sql) – CodyMR

Antwort

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) 

Erläuterung:

  • Externe Abfrage:Für jeden Datensatz in mytableC, bis MyParam (3, 4 oder 5 in der Frage), Aufzeichnungen vor dem letzten Datensatz.
    in der Abfrage in der where Klausel vertreten: FROM myTable As C WHERE C.ID_Col1 + [MyParam] -1 <= (SELECT MAX (D.ID_Col1) From myTable As D)
  • Innere Abfrage:berechnen die durchschnittlichen Value_Col2 von MyParam Aufzeichnungen, den aktuellen Datensatz zu starten.
    Representd in der Select Aussage: SELECT Avg(A.Value_Col2) und in der Where Klausel: WHERE A.ID_Col1 >= C.ID_Col1, als C.ID_Col1 der aktuellen ID zu sein, und und nicht mehr als [MyParam] Datensätze: A.ID_Col1 < C.ID_Col1 + [MyParam].

-Test

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 

Ergebnis für 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 

Ergebnis für 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, ich habe es getestet, ein bisschen modifiziert, jetzt funktioniert es ganz gut;) – marlan

+0

@honey - hast du keine schönen Antworten auf deine Frage erhalten? – marlan

1

eine korrelierte Aggregatunterabfrage Filterung Betrachten auf letzten drei IDs:

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; 

Ausgabe

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 

Wenn jedoch ID_Col1 ein Feld Autowert ist, gibt es keine Garantie der Werte in numerischer Ordnungszahl bleiben. Daher wird eine berechnete Zeilennummer RowNo sowohl in der abgeleiteten Tabelle als auch in der Aggregatunterabfrage benötigt. In MS Access SQL ohne CTEs, die Abfrage wird ein wenig wortreich: