2008-11-02 13 views
1

Étant donné le tableau suivant, comment calcule-t-on le mode horaire, ou la valeur avec la fréquence la plus élevée par heure?Calculer la distribution en mode (ou fréquence) d'une valeur dans le temps dans SQL Server

CREATE TABLE Values 
(
    ValueID int NOT NULL, 
    Value int NOT NULL, 
    LogTime datetime NOT NULL 
) 

Jusqu'à présent, j'ai trouvé la requête suivante.

SELECT count(*) AS Frequency, 
DatePart(yy, LogTime) as [Year], 
DatePart(mm, LogTime) as [Month], 
DatePart(dd, LogTime) as [Day], 
DatePart(hh, LogTime) as [Hour] 
FROM Values 
GROUP BY 
Value, 
DatePart(yy, LogTime), 
DatePart(mm, LogTime), 
DatePart(dd, LogTime), 
DatePart(hh, LogTime) 

Cependant, ceci donne la fréquence de chaque valeur distincte par heure. Comment puis-je ajouter une contrainte pour renvoyer uniquement la valeur avec la fréquence maximale par heure?

Merci

Répondre

1

Nest les agrégats ...

SELECT 
    MAX(Frequency) AS [Mode], 
    [Year],[Month],[Day],[Hour] 
FROM 
    (SELECT 
     COUNT(*) AS Frequency, 
     DatePart(yy, LogTime) as [Year], 
     DatePart(mm, LogTime) as [Month], 
     DatePart(dd, LogTime) as [Day], 
     DatePart(hh, LogTime) as [Hour] 
    FROM 
     Values 
    GROUP BY 
     Value, 
     DatePart(yy, LogTime), 
     DatePart(mm, LogTime), 
     DatePart(dd, LogTime), 
     DatePart(hh, LogTime) 
    ) foo 
GROUP By 
    [Year],[Month],[Day],[Hour] 
2

La requête suivante peut sembler étrange ... mais il fonctionne et il vous donne ce que vous voulez. Cette requête vous donnera la valeur qui avait la fréquence la plus élevée dans une "heure" particulière (tranche de temps).

Je suis PAS divisant en année, mois, jour, etc ... seulement heure (comme vous avez demandé) même si vous avez eu ces autres champs dans votre exemple de requête. J'ai choisi de faire "MAX (Valeur)" ci-dessous, parce que le cas peut se présenter où plus d'une "valeur" liée à la première place avec la fréquence la plus élevée par heure. Vous pouvez choisir de faire MIN, ou MAX ou un autre «bris d'égalité» si vous le souhaitez.

WITH GroupedValues (Value, Frequency, Hour) AS 
    (SELECT 
     Value, 
     COUNT(*) AS Frequency, 
     DATEPART(hh, LogTime) AS Hour 
    FROM 
     dbo.MyValues 
    GROUP BY 
     Value, 
     DATEPART(hh, LogTime)) 

SELECT 
    MAX(Value) AS Value, 
    a.Hour 
FROM 
    GroupedValues a INNER JOIN 
     (SELECT MAX(Frequency) AS MaxFrequency, 
      Hour FROM GroupedValues GROUP BY Hour) b 
    ON a.Frequency = b.MaxFrequency AND a.Hour = b.Hour 
GROUP BY 
    a.Hour