根据下表,如何计算每小时模式或按小时计算最高频率的值?
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)
但是,这会产生每小时不同值的频率。如何添加约束以仅按小时返回最大频率的值?
由于
答案 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]