sql >> データベース >  >> RDS >> Sqlserver

DateTimeを5、15、30、および60分間隔にグループ化します

    使用

    datediff(minute, '1990-01-01T00:00:00', yourDatetime)
    

    1990-1-1からの分数が表示されます(希望の基準日を使用できます)。

    次に、5、15、30、または60で除算し、この除算の結果でグループ化できます。整数除算として評価されるので、グループ化に使用できる整数が得られます。

    つまり、

    group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5
    

    更新 元の質問は、グループ化後にデータを日時形式で表示する必要があるように編集されたため、OPが必要とすることを実行するこの単純なクエリを追加しました。

    -- This convert the period to date-time format
    SELECT 
        -- note the 5, the "minute", and the starting point to convert the 
        -- period back to original time
        DATEADD(minute, AP.FiveMinutesPeriod * 5, '2010-01-01T00:00:00') AS Period,
        AP.AvgValue
    FROM
        -- this groups by the period and gets the average
        (SELECT
            P.FiveMinutesPeriod,
            AVG(P.Value) AS AvgValue
        FROM
            -- This calculates the period (five minutes in this instance)
            (SELECT 
                -- note the division by 5 and the "minute" to build the 5 minute periods
                -- the '2010-01-01T00:00:00' is the starting point for the periods
                datediff(minute, '2010-01-01T00:00:00', T.Time)/5 AS FiveMinutesPeriod,
                T.Value
            FROM Test T) AS P
        GROUP BY P.FiveMinutesPeriod) AP
    

    注:わかりやすくするために、これを3つのサブクエリに分けました。あなたはそれを裏返しに読むべきです。もちろん、単一のコンパクトなクエリとして記述できます。

    注:期間と開始日時を変更すると、特定の日から始まる週など、必要な間隔を取得できます。

    このクエリのテストデータを生成する場合は、次を使用してください:

    CREATE TABLE Test
    ( Id INT IDENTITY PRIMARY KEY,
    Time DATETIME,
    Value FLOAT)
    
    INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:00:22', 10)
    INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:03:22', 10)
    INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:04:45', 10)
    INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:07:21', 20)
    INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:10:25', 30)
    INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:11:22', 30)
    INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:14:47', 30)
    

    クエリを実行した結果は次のとおりです。

    Period                     AvgValue
    2012-03-22 00:00:00.000    10
    2012-03-22 00:05:00.000    20
    2012-03-22 00:10:00.000    30
    


    1. AlwaysOn可用性グループ:クォーラム

    2. Virtualmin:パスワードを変更した後はこのMySQLデータベースにアクセスできません

    3. 長時間実行されているデータベース操作をキャンセルするにはどうすればよいですか?

    4. Facebookのような通知追跡(DBデザイン)