1

次の表が与えられた場合、1 時間ごとのモード、または時間ごとの最高頻度の値をどのように計算しますか?

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)

ただし、これにより、時間ごとの各個別値の頻度が得られます。時間ごとの最大頻度の値のみを返すように制約を追加するにはどうすればよいですか?

ありがとう

4

2 に答える 2

2

次のクエリは奇妙に見えるかもしれませんが、機能し、必要なものが得られます。このクエリは、特定の「時間」(時間のスライス) で最も頻度の高い値を示します。

サンプルクエリに他のフィールドがあったとしても、私は年、月、日などに分割していません...(要求したとおり)時間だけです。

以下の "MAX(Value)" を選択したのは、複数の "value" が 1 時間ごとに最も高い頻度で 1 位に並んでいるケースが発生する可能性があるためです。必要に応じて、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
于 2008-11-02T20:22:03.127 に答える
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]
于 2008-11-02T18:34:11.380 に答える