복붙노트

[SQL] 5,15,30 60 분 간격으로 그룹 날짜 시간

SQL

5,15,30 60 분 간격으로 그룹 날짜 시간

나는, 15, 5로 그룹에 30 ~ 60 분 간격으로 일부 레코드를 시도하고있다 :

SELECT AVG(value) as "AvgValue",
sample_date/(5*60) as "TimeFive"
FROM DATA
WHERE id = 123 AND sample_date >= 3/21/2012

나는 각겠습니까 그룹 내 평균 값을 원하는 시간 단위로 여러 쿼리를 실행합니다. 5 분 쿼리는 다음과 같은 결과를 반환 할 것입니다 그래서 :

AvgValue  TimeFive
6.90      1995-01-01 00:05:00
7.15      1995-01-01 00:10:00
8.25      1995-01-01 00:15:00

30 분의 쿼리는이 발생할 것입니다 :

AvgValue  TimeThirty 
6.95      1995-01-01 00:30:00
7.40      1995-01-01 01:00:00

mm : 날짜 시간 열은 YYYY-MM-DD HH에 SS 형식

나는 나의 날짜 컬럼의 암시 적 변환 오류를 얻고있다. 어떤 도움을 많이 감사합니다!

해결법

  1. ==============================

    1.사용

    사용

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

    1990년 1월 1일가 (당신이 원하는 기준일을 사용할 수 있습니다) 때문에 당신에게 (분)을 제공 할 것입니다.

    이어서이 분할의 결과로 5, 15, 30, 60, 및 그룹으로 나눌 수있다. 당신은 당신이에 의해 그룹에 사용할 수있는 정수를 얻을 수 있습니다, 그래서 나는 그것이 정수 부문으로 평가됩니다 cheked했습니다.

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

    원래의 질문으로 업데이트를 그룹화 한 후 날짜 - 시간 형식으로 표시되는 데이터를 필요로 편집 한, 나는 영업 이익은 원하는 것을 할 것입니다 간단한 쿼리를 추가했습니다 :

    -- 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
    
  2. ==============================

    2.JotaBe의 대답 @에 구축하는 것은 (이에 나는에 언급 할 수 - 그렇지 않으면 나는 것), 당신은 또한 하위 쿼리 필요하지 않습니다 이런 식으로 뭔가를 시도 할 수 있습니다.

    JotaBe의 대답 @에 구축하는 것은 (이에 나는에 언급 할 수 - 그렇지 않으면 나는 것), 당신은 또한 하위 쿼리 필요하지 않습니다 이런 식으로 뭔가를 시도 할 수 있습니다.

     SELECT 
        AVG(value) AS 'AvgValue',
    
        -- Add the rounded seconds back onto epoch to get rounded time
        DATEADD(
            MINUTE,
            (DATEDIFF(MINUTE, '1990-01-01T00:00:00', your_date) / 30) * 30,
            '1990-01-01T00:00:00'
        )      AS 'TimeThirty'
    
     FROM YourTable
     -- WHERE your_date > some max lookback period
     GROUP BY
        (DATEDIFF(MINUTE, '1990-01-01T00:00:00', your_date) / 30)
    

    이 변경 사항은 임시 테이블 및 하위 쿼리를 제거합니다. 내가 그냥 둥근 날짜와 시간을 얻을 수있는 간격 계산을 반대하고있어 결과의 일부로서 데이터 등을 제시하면 30 분 간격으로 그룹화하지만 동일한 코어 로직을 사용합니다.

  3. ==============================

    3.그래서, 경우에 당신은이 인터넷 검색,하지만 당신은 내 사건이었다 MySQL은, 그것을 수행해야합니다

    그래서, 경우에 당신은이 인터넷 검색,하지만 당신은 내 사건이었다 MySQL은, 그것을 수행해야합니다

    MySQL의에서 당신은 할 수있다

    GROUP BY
    CONCAT(
        DATE_FORMAT(`timestamp`,'%m-%d-%Y %H:'),
        FLOOR(DATE_FORMAT(`timestamp`,'%i')/5)*5
    )
    
  4. from https://stackoverflow.com/questions/9814930/group-datetime-into-5-15-30-and-60-minute-intervals by cc-by-sa and MIT license