[SQL] SELECT / GROUP BY - 시간 세그먼트 (10 초 30 초 등)
SQLSELECT / 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.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.내 프로젝트에 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.또 다른 솔루션입니다.
또 다른 솔루션입니다.
당신이 당신의 간격 (예에서 칠초)에 의해 모듈에 의해 타임 스탬프 및 그룹에 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.아주 이상한하지만 여기에 솔루션을 사용 :
아주 이상한하지만 여기에 솔루션을 사용 :
주어진 시간에 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)에 의해 분할 우리를 생각하면서이다
from https://stackoverflow.com/questions/3086386/select-group-by-segments-of-time-10-seconds-30-seconds-etc by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 쿼리는 SQL 서버에서 날짜를 삽입 (0) | 2020.04.01 |
---|---|
[SQL] 필드가 null는 MySQL의에있는 경우 0을 반환 (0) | 2020.04.01 |
[SQL] 데이터베이스에, 각각의 테이블 및 필드의 목록을 얻기 (0) | 2020.04.01 |
[SQL] SQL Server의 주 번호에서 일주일의 시작 날짜와 주 종료 날짜를 가져옵니다 (0) | 2020.03.31 |
[SQL] 어떻게 NULL 열에 고유 인덱스를 만드는 방법? (0) | 2020.03.31 |