计算SQL Server中值随时间的模式(或频率)分布

时间:2008-11-02 17:35:00

标签: sql sql-server frequency mode

根据下表,如何计算每小时模式或按小时计算最高频率的值?

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 个答案:

答案 0 :(得分:2)

以下查询可能看起来很奇怪...但它可以工作,它可以为您提供所需的内容。此查询将为您提供特定“小时”(时间片段)中具有最高频率的值。

即使你在示例查询中有其他字段,我 NOT 分为年,月,日等等......只有一小时(按照您的要求)。

我选择在下方执行“MAX(Value)”,因为这种情况可能会出现多个“价值”并列第一位且频率最高的小时。如果你愿意,你可以选择做MIN,MAX或其他'tiebreaker'。

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 :(得分:1)

嵌套聚合...

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]