복붙노트

[SQL] SELECT / GROUP BY - 시간 세그먼트 (10 초 30 초 등)

SQL

SELECT / GROUP BY - 시간 세그먼트 (10 초 30 초 등)

나는 테이블 (MySQL의) 캡처 샘플 n 초마다이 있습니다. 표는 많은 열이 있지만,이에 대한 모든 문제는 두 가지이다 : (TIMESTAMP 유형의) 타임 스탬프와 (유형 INT의) 수입니다.

내가 뭘하고 싶은, 배의 범위에 걸쳐 카운트 컬럼의 합계 및 평균을 얻을 수있다. 예를 들어, I는 2 초마다 샘플을 기록하지만, I는 10 초 모든 샘플을 30 번째 창 내의 모든 샘플 카운트 열의 합 싶다.

여기에 데이터의 예입니다 :

+---------------------+-----------------+
| time_stamp          | count           |
+---------------------+-----------------+
| 2010-06-15 23:35:28 |               1 |
| 2010-06-15 23:35:30 |               1 |
| 2010-06-15 23:35:30 |               1 |
| 2010-06-15 23:35:30 |             942 |
| 2010-06-15 23:35:30 |             180 |
| 2010-06-15 23:35:30 |               4 |
| 2010-06-15 23:35:30 |              52 |
| 2010-06-15 23:35:30 |              12 |
| 2010-06-15 23:35:30 |               1 |
| 2010-06-15 23:35:30 |               1 |
| 2010-06-15 23:35:33 |            1468 |
| 2010-06-15 23:35:33 |             247 |
| 2010-06-15 23:35:33 |               1 |
| 2010-06-15 23:35:33 |              81 |
| 2010-06-15 23:35:33 |              16 |
| 2010-06-15 23:35:35 |            1828 |
| 2010-06-15 23:35:35 |             214 |
| 2010-06-15 23:35:35 |              75 |
| 2010-06-15 23:35:35 |               8 |
| 2010-06-15 23:35:37 |            1799 |
| 2010-06-15 23:35:37 |              24 |
| 2010-06-15 23:35:37 |              11 |
| 2010-06-15 23:35:37 |               2 |
| 2010-06-15 23:35:40 |             575 |
| 2010-06-15 23:35:40 |               1 |
| 2010-06-17 10:39:35 |               2 |
| 2010-06-17 10:39:35 |               2 |
| 2010-06-17 10:39:35 |               1 |
| 2010-06-17 10:39:35 |               2 |
| 2010-06-17 10:39:35 |               1 |
| 2010-06-17 10:39:40 |              35 |
| 2010-06-17 10:39:40 |              19 |
| 2010-06-17 10:39:40 |              37 |
| 2010-06-17 10:39:42 |              64 |
| 2010-06-17 10:39:42 |               3 |
| 2010-06-17 10:39:42 |              31 |
| 2010-06-17 10:39:42 |               7 |
| 2010-06-17 10:39:42 |             246 |
+---------------------+-----------------+

(위의 데이터를 기준으로) 내가 좋아하는 것 출력은 다음과 같아야합니다 :

+---------------------+-----------------+
| 2010-06-15 23:35:00 |               1 |  # This is the sum for the 00 - 30 seconds range
| 2010-06-15 23:35:30 |            7544 |  # This is the sum for the 30 - 60 seconds range
| 2010-06-17 10:39:35 |             450 |  # This is the sum for the 30 - 60 seconds range
+---------------------+-----------------+

나는 두 번째로이 번호를 수집하거나 분에 의해 GROUP BY를 사용했다,하지만 난 제대로 작동하려면 명령에 의해 초 그룹의 하위 분 또는 범위를 얻기 위해 구문을 알아낼 수 없습니다.

나는 주로 다른 테이블이 테이블에서 데이터를 사이펀이 쿼리를 사용하는 것입니다.

감사!

해결법

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

    1.GROUP BY UNIX_TIMESTAMP (TIME_STAMP) DIV (30)

    GROUP BY UNIX_TIMESTAMP (TIME_STAMP) DIV (30)

    또는 GROUP BY 당신이 사용할 수있는 값 사이의 경계를 변경하는 등 DIV (20)가 될 것이다 20 초 간격으로 그룹화 싶었 어떤 이유로 말

    GROUP BY (UNIX_TIMESTAMP (TIME_STAMP) + R) DIV (30)

    r은 문자 그대로의 음이 아닌 정수 적은 30 그럼 이상입니다

    GROUP BY (UNIX_TIMESTAMP (TIME_STAMP) + 5) DIV (30)

    mm : 당신에게 HH 사이의 금액을 제공해야 05 및 HH : MM : 35 사이 HH : MM : 35, HH : MM + 1 : 05.

  2. ==============================

    2.내 프로젝트에 Hammerite의 솔루션을하려고했으나 시리즈에서 실종 된 샘플이 어디 있었는지는 잘 작동하지 않았다. 여기에 27 분 시간 간격으로 metric_table 및 그룹 결과에서 타임 스탬프 (TS), 사용자 이름 및 평균 측정을 선택하도록되어 쿼리의 예입니다 :

    내 프로젝트에 Hammerite의 솔루션을하려고했으나 시리즈에서 실종 된 샘플이 어디 있었는지는 잘 작동하지 않았다. 여기에 27 분 시간 간격으로 metric_table 및 그룹 결과에서 타임 스탬프 (TS), 사용자 이름 및 평균 측정을 선택하도록되어 쿼리의 예입니다 :

    select 
        min(ts), 
        user_name, 
        sum(measure) / 27
    from metric_table 
    where 
        ts between date_sub('2015-03-17 00:00:00', INTERVAL 2160 MINUTE) and '2015-03-17 00:00:00' 
    
    group by unix_timestamp(ts) div 1620, user_name 
    order by ts, user_name
    ;
    

    참고 27 분 (일부에서) (기준 그룹) 1,620초 = 삼일 2,160분 (즉, 시간 범위입니다) =

    (즉 : 주어진 타임 스탬프에 대한 모든 사용자 이름에 대한 측정 값을 찾을 보장이 없었다) 내가 샘플을 불규칙적으로 기록 된 시계열에 대해이 쿼리를 실행하면 결과는 간격에 따라 스탬프되지 않은 (배치되지 않았다 모든 27분). I가 예상 층보다 큰 어떤 그룹에 타임 스탬프를 반환하는 최소 (TS)으로 인한 것으로 의심 (I + TS0 간격 *). 나는이 일에 이전 쿼리를 수정 :

    select 
        from_unixtime(unix_timestamp(ts) - unix_timestamp(ts) mod 1620) as ts1, 
        user_name, 
        sum(measure) / 27
    from metric_table
    where 
        ts between date_sub('2015-03-17 00:00:00', INTERVAL 2160 MINUTE) and '2015-03-17 00:00:00' 
    
    group by ts1, user_name 
    order by ts1, user_name
    ;
    

    그리고 샘플이없는 미세도 작동합니다. 나는 시간 수학 선택으로 이동되면이 TS1은 시간 단계에 맞춰 것을 보장하기 때문에 그 생각합니다.

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

    3.또 다른 솔루션입니다.

    또 다른 솔루션입니다.

    당신이 당신의 간격 (예에서 칠초)에 의해 모듈에 의해 타임 스탬프 및 그룹에 DT를 변환 할 수 있습니다 원하는 간격하면 평균 이상.

    select FROM_UNIXTIME(
        UNIX_TIMESTAMP(dt_record) - UNIX_TIMESTAMP(dt_record) mod 7
    ) as dt, avg(1das4hrz) from `meteor-m2_msgi`
    where dt_record>='2016-11-13 05:00:00'
    and dt_record < '2016-11-13 05:02:00'
    group by FROM_UNIXTIME(
        UNIX_TIMESTAMP(dt_record) - UNIX_TIMESTAMP(dt_record) mod 7);
    

    그것이 어떻게 작동하는지 보여주기 위해, 내가 계산을 보여주는 요청을 준비합니다.

    select dt_record, minute(dt_record) as mm, SECOND(dt_record) as ss,
    UNIX_TIMESTAMP(dt_record) as uxt, UNIX_TIMESTAMP(dt_record) mod 7 as ux7,
    FROM_UNIXTIME(
        UNIX_TIMESTAMP(dt_record) - UNIX_TIMESTAMP(dt_record) mod 7) as dtsub,
    column from `yourtable` where dt_record>='2016-11-13 05:00:00'
    and dt_record < '2016-11-13 05:02:00';
    
    +---------------------+--------------------+
    | dt                  | avg(column)        |
    +---------------------+--------------------+
    | 2016-11-13 04:59:43 |  25434.85714285714 |
    | 2016-11-13 05:00:42 |  5700.728813559322 |
    | 2016-11-13 05:01:41 |  950.1016949152543 |
    | 2016-11-13 05:02:40 |  4671.220338983051 |
    | 2016-11-13 05:03:39 | 25468.728813559323 |
    | 2016-11-13 05:04:38 |  43883.52542372881 |
    | 2016-11-13 05:05:37 | 24589.338983050846 |
    +---------------------+--------------------+
    
    
    +---------------------+-----+-----+------------+------+---------------------+----------+
    | dt_record           | mm  | ss  | uxt        | ux7  | dtsub               | column   |
    +---------------------+------+-----+------------+------+---------------------+----------+
    | 2016-11-13 05:00:00 |   0 |   0 | 1479002400 |    1 | 2016-11-13 04:59:59 |    36137 |
    | 2016-11-13 05:00:01 |   0 |   1 | 1479002401 |    2 | 2016-11-13 04:59:59 |    36137 |
    | 2016-11-13 05:00:02 |   0 |   2 | 1479002402 |    3 | 2016-11-13 04:59:59 |    36137 |
    | 2016-11-13 05:00:03 |   0 |   3 | 1479002403 |    4 | 2016-11-13 04:59:59 |    34911 |     
    | 2016-11-13 05:00:04 |   0 |   4 | 1479002404 |    5 | 2016-11-13 04:59:59 |    34911 |
    | 2016-11-13 05:00:05 |   0 |   5 | 1479002405 |    6 | 2016-11-13 04:59:59 |    34911 |
    | 2016-11-13 05:00:06 |   0 |   6 | 1479002406 |    0 | 2016-11-13 05:00:06 |    33726 |
    | 2016-11-13 05:00:07 |   0 |   7 | 1479002407 |    1 | 2016-11-13 05:00:06 |    32581 |
    | 2016-11-13 05:00:08 |   0 |   8 | 1479002408 |    2 | 2016-11-13 05:00:06 |    32581 |
    | 2016-11-13 05:00:09 |   0 |   9 | 1479002409 |    3 | 2016-11-13 05:00:06 |    31475 |
    +---------------------+-----+-----+------------+------+---------------------+----------+
    

    사람이 빨리 무언가를 제안 할 수 있습니다?

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

    4.아주 이상한하지만 여기에 솔루션을 사용 :

    아주 이상한하지만 여기에 솔루션을 사용 :

    주어진 시간에 5 분마다 데이터의 평균

    우리는 같은 것을 제안 할 수 있습니다 :

    select convert(
                  (min(dt_record) div 50)*50 - 20*((convert(min(dt_record), 
                   datetime) div 50) mod 2), datetime)  as dt, 
           avg(1das4hrz) 
    from `meteor-m2_msgi`
    where dt_record>='2016-11-13 05:00:00'
           and dt_record < '2016-11-14 00:00:00' 
    group by convert(dt_record, datetime) div 50;
    
    
    select (
    convert(
    min(dt_record), datetime) div 50)*50 - 20*(
    (convert(min(dt_record), datetime) div 50) mod 2
    ) as dt,
    avg(column) from `your_table`
    where dt_record>='2016-11-13 05:00:00'
    and dt_record < '2016-11-14 00:00:00'
    group by convert(dt_record, datetime) div 50;
    

    NORMAL 분의 2가 30 초 있기 때문에 50 'INTEGER의 날짜 형식은'(50)에 의해 분할 우리를 생각하면서이다

  5. from https://stackoverflow.com/questions/3086386/select-group-by-segments-of-time-10-seconds-30-seconds-etc by cc-by-sa and MIT license