2008-11-02 1 views
1

В соответствии с приведенной ниже таблицей, как рассчитать часовой режим или значение с самой высокой частотой по часам?Вычисление режима (или частоты) распределения значения с течением времени в SQL Server

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

До сих пор я пришел к следующему запросу.

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) 

Однако это дает частоту каждого отдельного значения по часам. Как добавить ограничение, чтобы возвращать значение с максимальной частотой в час?

Благодаря

ответ

1

Nest агрегаты ...

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

Следующий запрос может выглядеть странно ... но это работает, и это дает вам то, что вы хотите. Этот запрос даст вам значение, которое имеет самую высокую частоту в определенном «часе» (срез времени).

Я НЕ, делящий на Год, Месяц, День и т. Д. Только час (по вашему запросу), даже если у вас были другие поля в вашем примере запроса.

Я решил сделать «MAX (Value)» ниже, потому что случай может возникнуть, когда более чем одно «значение» привязано к первому месту с самой высокой частотой по часам. Вы можете выбрать MIN, MAX или какой-либо другой «тай-брейк», если хотите.

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 
Смежные вопросы