Frage Nehmen Sie den stündlichen Durchschnitt in SQL


Ich habe eine SQL-Tabelle mit 2 Feldern: TimeStamp und Value. Nachfolgend finden Sie einen Auszug einiger Daten.

2005-02-17 13:31:00     2
2005-02-17 13:46:00     3
2005-02-17 14:01:00     1.7
2005-02-17 14:16:00     2.3
2005-02-17 14:31:00     2
2005-02-17 14:46:00     2.5
2005-02-17 15:01:00     2.2
2005-02-17 15:16:00     2.4
2005-02-17 15:31:00     2.6
2005-02-17 15:46:00     2.6
2005-02-17 16:01:00     2.7

Ich versuche, einen stündlichen Durchschnitt der Wertspalte zu nehmen, aber ich kann nicht scheinen, dass dies richtig funktioniert. Die endgültige Ausgabe würde die Anfangszeit für den Zeitstempel und den Durchschnittswert für die Spalte Wert anzeigen.

Für die endgültige Ausgabe suche ich einen vollen Zeitstempel, nicht nur die Stunde. Also von 14:00 - 14:59 am 2005-02-17 wäre die resultierende Ausgabe:

2005-02-17 14:00:00    2.125

5
2018-03-16 20:33


Ursprung


Antworten:


Ich würde es so machen:

SELECT      CAST(FLOOR(CAST(timestamp AS float)) AS datetime) AS day --strip time
            , DATEPART(hh, timestamp) AS hour
            , AVG(value) AS average
FROM        times
GROUP BY    CAST(FLOOR(CAST(timestamp AS float)) AS datetime)
            , DATEPART(hh, timestamp)

Beispiel Geige.


4
2018-03-17 03:55



select Time_Stamp_Hour=dateadd(hh,datepart(hh,Time_Stamp), cast(CAST(Time_Stamp as date) as datetime))
, AvgValue=AVG(Value)
from ValueLog
group by dateadd(hh,datepart(hh,Time_Stamp), cast(CAST(Time_Stamp as date) as datetime))

Ergebnis:

Time_Stamp_Hour         AvgValue
----------------------- ----------------------
2005-02-17 13:00:00.000 2.5
2005-02-17 14:00:00.000 2.125
2005-02-17 15:00:00.000 2.45
2005-02-17 16:00:00.000 2.7

Kompatibilität: Sql Server 2008+


4
2018-03-17 03:36



SELECT DATEPART(hour,Col1) as hourcol,AVG(Col2)
FROM Yourtable
GROUP BY hourcol;

ODER

SELECT SUBSTRING(Col1,1,14)+'00' AS hourcol,AVG(Col2)
FROM Yourtable
GROUP BY hourcol;

In dieser Abfrage berechnet die DATEPART-Funktion den Stundenwert für alle Werte in der Spalte DATETIME und basierend auf jeder Stunde wird der Durchschnitt der zweiten Spalte auf Stundenebene berechnet.


3
2018-03-16 20:38



Ich denke du willst es auch nach Datum sortiert haben, nicht nur nach Stunden, oder?

select
  convert(VARCHAR(10), date, 111) as aDate,
  datepart(HH, date) anHour,
  avg(value) anAverage
from t
group by convert(VARCHAR(10), date, 111), datepart(HH, date)

Oder dieses:

; with aTable as (
select
  convert(VARCHAR(10), date, 111) as aDate,
  datepart(HH, date) anHour,
  value
from t)
select aDate, anHour, avg(value) from aTable
group by aDate, anHour

0
2018-03-16 20:46



SELECT
    AVG(myvalue) [Average],
    DATEADD(HOUR, DATEPART(HOUR, mydate), CAST(CAST(mydate as Date) as datetime)) [Hour]
FROM
    myTable
GROUP BY
    DATEADD(HOUR, DATEPART(HOUR, mydate), CAST(CAST(mydate as Date) as datetime))
ORDER BY
    DATEADD(HOUR, DATEPART(HOUR, mydate), CAST(CAST(mydate as Date) as datetime))

0
2018-03-16 20:48