【问题标题】:Calculate mode (or frequency) distribution of a value over time in SQL Server在 SQL Server 中计算值随时间的模式(或频率)分布
【发布时间】:2008-11-02 17:35:00
【问题描述】:

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

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)

但是,这会按小时生成每个不同值的频率。如何添加约束以仅按小时返回具有最大频率的值?

谢谢

【问题讨论】:

    标签: sql sql-server frequency mode


    【解决方案1】:

    以下查询可能看起来很奇怪……但它确实有效,并且可以为您提供所需的内容。此查询将为您提供在特定“小时”(时间片)中频率最高的值。

    划分为年、月、日等...仅小时(如您所要求),即使您的示例查询中有其他字段。

    我选择在下面执行“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
    

    【讨论】:

      【解决方案2】:

      嵌套聚合...

      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]
      

      【讨论】:

        猜你喜欢
        • 2018-08-13
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2016-10-30
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        相关资源
        最近更新 更多