Расчет режима (или частоты) распределения значения во времени в SQL Server - PullRequest
1 голос
/ 02 ноября 2008

Учитывая приведенную ниже таблицу, как рассчитать часовой режим или значение с наибольшей частотой по часам?

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)

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 ноября 2008

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

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

Я решил сделать «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
1 голос
/ 02 ноября 2008

Гнездо агрегатов ...

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]
...