2017-01-25 2 views
0

Die Daten, mit denen ich arbeite, haben keinen Primärschlüssel, stattdessen werden sie nach einem TMC-Wert und einem Datumswert gruppiert. Was ich versuche zu tun, ist 5 Minuten Epochenwerte zu nehmen und sie in eine 15-Minuten-Epoche zu kombinieren, um durchschnittlich drei Datensätze gleichzeitig. Also werden die Epochen 0, 1, 2 zusammen gemittelt, um einen neuen Rekord zu bekommen, dann 3,4,5 und so weiter. Hier ist eine Beispieltabelle. Ich weiß nicht, wie dies korrekt zu formatieren:Nimmt einen gleitenden Durchschnitt von drei Datensätzen gleichzeitig mit zwei Gruppen nach Werten auf

TMC   DATE EPOCH TRAVEL_TIME_ALL_VEHICLES 
113N04415 1012016 0  228 
113N04415 1012016 1  228 
113N04415 1012016 2  222 
113N04415 1012016 3  224 
113N04415 1012016 4  229 
113N04415 1012016 5  223 

Ich glaube, ich bin in der Nähe mit diesem Code, wie es für den ersten Datensatz funktioniert, aber nicht für die zweite:

select tmc, date, avg(Travel_TIME_ALL_VEHICLES) AS TRAVEL_avg 
from (select I40_2016_ALL.*, 
      row_number() over (order by TMC, date, epoch) as rn 
     from I40_2016_ALL) I40_2016_ALL 
where tmc = '113n04415' and date = '1012016' 
group by TMC, DATE, floor((rn - 1)/3) 
ORDER BY TMC, DATE 
+0

Bitte Kennzeichnen Sie Ihre Frage mit dem RDBMS, das Sie tatsächlich verwenden. MySQL implementiert noch keine Fensterfunktion wie 'row_number' afaik. –

+0

RDBMS? Ich benutze Microsoft SQL Server Management Studio. –

Antwort

0

Sie verwenden integer-Division wie folgt aus:

SELECT TMC, [DATE], EPOCH, AVG(TRAVEL_TIME_ALL_VEHICLES) AS TRAVEL_avg  
FROM (
    SELECT TMC, [DATE], TRAVEL_TIME_ALL_VEHICLES, 
      ROW_NUMBER() OVER (ORDER BY TMC, [DATE], EPOCH) AS rn 
    FROM I40_2016_ALL) AS t 
GROUP BY TMC, [DATE], (rn -1)/ 3 
ORDER BY TMC, [DATE] 

diese Abfrage stellt Reihen 1,2,3 in einer Gruppe, Reihen 4, 5, 6 in der nächsten Gruppe, usw.

+0

Das hat nichts getan, zeigt nur die Vanille-Aufzeichnungen. –

+0

@BenZeddicus Entschuldigung. Ich habe versehentlich das Feld "EPOCH" in die Klausel "GROUP BY" eingefügt. Bitte überprüfe die Änderung, die ich gemacht habe. –

+0

Das funktioniert, aber die Bestellung ist überall. Ich brauche es in Reihenfolge von tmc und Datum. –

0

Etwas wie:

SELECT AVG(TRAVEL_TIME_ALL_VEHICLES) 
FROM 
(
SELECT TRAVEL_TIME_ALL_VEHICLES AS TRAVEL_TIME_ALL_VEHICLES 
,(ROW_NUMBER() OVER (Order by EPOCH) + 2)/3 AS GroupID 
FROM 
YourTable 
) AS d 
GROUP BY d.GroupID 
+0

Fehler bei RANK: –

+0

Msg 207, Ebene 16, Status 1, Zeile 6 Ungültiger Spaltenname 'RANK'. Msg 4108, Ebene 15, Status 1, Zeile 6 Fensterfunktionen können nur in den SELECT- oder ORDER BY-Klauseln angezeigt werden. –

+0

Entschuldigung, ich habe das RANK entfernt, ersetzt durch EPOCH –

0

Ummmm, das nicht versuchte, aber was ist:

select tmc, date, floor((epoch + 1)/3) as part, 
      avg(Travel_TIME_ALL_VEHICLES) AS TRAVEL_avg 
     from I40_2016_ALL 
    where tmc = '113n04415' and date = '1012016' 
    group by TMC, DATE, floor((epoch + 1)/3) 

Oder wenn Sie jede Zeile mit dem Gesamt wollen ...

 select tmc, date, floor((epoch + 1)/3) as part, 
       avg(Travel_TIME_ALL_VEHICLES) 
       over (partition by TMC, DATE, floor((epoch + 1)/3)) AS TRAVEL_avg 
      from I40_2016_ALL 
     where tmc = '113n04415' and date = '1012016' 
+0

Es gibt keine FROM-Klausel in diesen. –

+0

Entschuldigung !!! Bearbeitet. –

+0

Viel besser, aber die Segmentierung ist um eins. Die ersten beiden Datensätze sind für sich allein und der letzte Datensatz ist für sich allein. Ich vermute, dass 287 Datensätze vorliegen. Also, irgendwo werden nur 2 Datensätze gemittelt. –

Verwandte Themen