복붙노트

[SQL] 시간 범위 내에서 5 분 간격으로 그룹화

SQL

시간 범위 내에서 5 분 간격으로 그룹화

MySQL은 내가 원하는 것을 명령에 좀 어려움이있다.

SELECT a.timestamp, name, count(b.name) 
FROM time a, id b 
WHERE a.user = b.user
  AND a.id = b.id
  AND b.name = 'John'
  AND a.timestamp BETWEEN '2010-11-16 10:30:00' AND '2010-11-16 11:00:00' 
GROUP BY a.timestamp

이것은 내 전류 출력 문입니다.

timestamp            name  count(b.name)
-------------------  ----  -------------
2010-11-16 10:32:22  John  2
2010-11-16 10:35:12  John  7
2010-11-16 10:36:34  John  1
2010-11-16 10:37:45  John  2
2010-11-16 10:48:26  John  8
2010-11-16 10:55:00  John  9
2010-11-16 10:58:08  John  2

어떻게 오분 간격 결과로 I 그룹을합니까?

내 출력처럼되고 싶어요

timestamp            name  count(b.name)
-------------------  ----  -------------
2010-11-16 10:30:00  John  2
2010-11-16 10:35:00  John  10
2010-11-16 10:40:00  John  0
2010-11-16 10:45:00  John  8
2010-11-16 10:50:00  John  0
2010-11-16 10:55:00  John  11 

해결법

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

    1.이것은 모든 간격으로 작동합니다.

    이것은 모든 간격으로 작동합니다.

    PostgreSQL의

    SELECT
        TIMESTAMP WITH TIME ZONE 'epoch' +
        INTERVAL '1 second' * round(extract('epoch' from timestamp) / 300) * 300 as timestamp,
        name,
        count(b.name)
    FROM time a, id 
    WHERE …
    GROUP BY 
    round(extract('epoch' from timestamp) / 300), name
    

    MySQL의

    SELECT
        timestamp,  -- not sure about that
        name,
        count(b.name)
    FROM time a, id 
    WHERE …
    GROUP BY 
    UNIX_TIMESTAMP(timestamp) DIV 300, name
    
  2. ==============================

    2.당신은 오히려 GROUP BY UNIX_TIMESTAMP (TIME_STAMP) DIV (300) 대신 때문에 내가 어떤 기록이 개 그룹화 된 결과 세트로 계산되는 것을 발견 반올림 라운드 (../ 300)를 사용한다.

    당신은 오히려 GROUP BY UNIX_TIMESTAMP (TIME_STAMP) DIV (300) 대신 때문에 내가 어떤 기록이 개 그룹화 된 결과 세트로 계산되는 것을 발견 반올림 라운드 (../ 300)를 사용한다.

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

    3.저도 같은 문제를 가로 질러왔다.

    저도 같은 문제를 가로 질러왔다.

    나는 그것이 어떤 분 간격으로 그룹에 쉽게 발견하다  단 몇 초의 양 분 시대를 나눈 다음 중 하나를 반올림 또는 나머지를 타고 얻을 층을 사용. 당신이 5 분 간격 얻으려면 그래서 당신은 300 초를 사용합니다.

    SELECT COUNT(*) cnt, 
    to_timestamp(floor((extract('epoch' from timestamp_column) / 300 )) * 300) 
    AT TIME ZONE 'UTC' as interval_alias
    FROM TABLE_NAME GROUP BY interval_alias
    

  4. ==============================

    4.포스트 그레스, 나는 쉽게하고를 사용하는 것이 더 정확 발견

    포스트 그레스, 나는 쉽게하고를 사용하는 것이 더 정확 발견

    date_trunc

    기능, 같은 :

    select name, sum(count), date_trunc('minute',timestamp) as timestamp
    FROM table
    WHERE xxx
    GROUP BY name,date_trunc('minute',timestamp)
    ORDER BY timestamp
    

    당신은 date_trunc에 ... '분', '시간', '하루'등 같은 다양한 해상도를 제공 할 수 있습니다.

  5. ==============================

    5.쿼리는 같은 될 것입니다 :

    쿼리는 같은 될 것입니다 :

    SELECT 
      DATE_FORMAT(
        MIN(timestamp),
        '%d/%m/%Y %H:%i:00'
      ) AS tmstamp,
      name,
      COUNT(id) AS cnt 
    FROM
      table
    GROUP BY ROUND(UNIX_TIMESTAMP(timestamp) / 300), name
    
  6. ==============================

    6.당신은 아마 YMD로 타임 스탬프를 중단해야 할거야 : HM 사용 DIV 5 5 분 쓰레기통에 분을 분할 - 같은 것을

    당신은 아마 YMD로 타임 스탬프를 중단해야 할거야 : HM 사용 DIV 5 5 분 쓰레기통에 분을 분할 - 같은 것을

    select year(a.timestamp), 
           month(a.timestamp), 
           hour(a.timestamp), 
           minute(a.timestamp) DIV 5,
           name, 
           count(b.name)
    FROM time a, id b
    WHERE a.user = b.user AND a.id = b.id AND b.name = 'John' 
          AND a.timestamp BETWEEN '2010-11-16 10:30:00' AND '2010-11-16 11:00:00'
    GROUP BY year(a.timestamp), 
           month(a.timestamp), 
           hour(a.timestamp), 
           minute(a.timestamp) DIV 12
    

    ... 그리고 클라이언트 코드의 출력은 당신이 그것을 원하는 방식으로 표시하는 futz에. 또는, 당신 같은 경우, 별도의 열을 얻을 수있는 SQL CONCAT의 operatorinstead를 사용하여 전체 날짜 문자열을 구축 할 수 있습니다.

    select concat(year(a.timestamp), "-", month(a.timestamp), "-" ,day(a.timestamp), 
           " " , lpad(hour(a.timestamp),2,'0'), ":", 
           lpad((minute(a.timestamp) DIV 5) * 5, 2, '0'))
    

    ... 그리고 그에 다음 그룹

  7. ==============================

    7.확실하지가 여전히 필요합니다.

    확실하지가 여전히 필요합니다.

    SELECT FROM_UNIXTIME(FLOOR((UNIX_TIMESTAMP(timestamp))/300)*300) AS t,timestamp,count(1) as c from users GROUP BY t ORDER BY t;
    
  8. ==============================

    8.이건 어때:

    이건 어때:

    select 
        from_unixtime(unix_timestamp(timestamp) - unix_timestamp(timestamp) mod 300) as ts,  
        sum(value)
    from group_interval 
    group by ts 
    order by ts
    ;
    
  9. ==============================

    9.나는 MySQL과 아마 올바른 쿼리는 다음과 같은 것을 발견 :

    나는 MySQL과 아마 올바른 쿼리는 다음과 같은 것을 발견 :

    SELECT SUBSTRING( FROM_UNIXTIME( CEILING( timestamp /300 ) *300,  
                                     '%Y-%m-%d %H:%i:%S' ) , 1, 19 ) AS ts_CEILING,
    SUM(value)
    FROM group_interval
    GROUP BY SUBSTRING( FROM_UNIXTIME( CEILING( timestamp /300 ) *300,  
                                       '%Y-%m-%d %H:%i:%S' ) , 1, 19 )
    ORDER BY SUBSTRING( FROM_UNIXTIME( CEILING( timestamp /300 ) *300,  
                                       '%Y-%m-%d %H:%i:%S' ) , 1, 19 ) DESC
    

    당신이 무슨 생각을하는지 제게 알려주세요.

  10. ==============================

    10.

    select 
    CONCAT(CAST(CREATEDATE AS DATE),' ',datepart(hour,createdate),':',ROUNd(CAST((CAST((CAST(DATEPART(MINUTE,CREATEDATE) AS DECIMAL (18,4)))/5 AS INT)) AS DECIMAL (18,4))/12*60,2)) AS '5MINDATE'
    ,count(something)
    from TABLE
    group by CONCAT(CAST(CREATEDATE AS DATE),' ',datepart(hour,createdate),':',ROUNd(CAST((CAST((CAST(DATEPART(MINUTE,CREATEDATE) AS DECIMAL (18,4)))/5 AS INT)) AS DECIMAL (18,4))/12*60,2))
    
  11. from https://stackoverflow.com/questions/4342370/grouping-into-interval-of-5-minutes-within-a-time-range by cc-by-sa and MIT license