2012-06-28 3 views
3

나는이 같은 MySQL의 테이블이 :MySQL은 : 시계열 데이터에서 추출 카운터 차이

우리가 업데이 트를 얻을 때마다 우리는 이벤트 카운터의 값을 저장
CREATE TABLE IF NOT EXISTS `mytable` (
    `ts` datetime NOT NULL, 
    `cnt` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`ts`) 
) ENGINE=InnoDB; 

; 이러한 업데이트는 임의의 시간에 도착합니다.

X 시간 (예 : 5 분, 1 일, 1 개월 등)마다 이벤트 수를 추출하는 방법은 무엇입니까? 나는 쉽게 이것을 날짜/시간 SQL 함수 (예 : 시간, 일, 월 등)를 통해 추출 된 간격으로 단순화 할 수 있습니다.

우리는 보장 할 수 없지만 추출하려는 간격과 비교할 때 평균 데이터는 "밀집"입니다. EG. 데이터는 대개 매 시간마다 여러 번 나타납니다. 그러나 나는 한 시간 간격으로 이벤트 수를 묻지 않을 것입니다. < 1 시간. 저장된 데이터에 "문제"(예 : 큰 구멍)가있는 경우 결과에 "문제"가있는 것이 허용됩니다. 예를 들어

, 나는이 (24 시간 기간 예)와 같은 쿼리에 관심이 카운터 값을 얻을 수 있습니다 :

SELECT ts, cnt 
FROM mytable 
GROUP BY DATE(ts) 
ORDER BY ts DESC 

을 ... 그리고 이벤트가 쉽게 빼서 계산 될 수 계산 각 행의 카운터는 전임자와 동일합니다. 하지만 가능한 경우 SQL에서 그렇게하고 싶습니다. 또한

,이 문제에 대한 좋은 이름은 (난 당신이 시계열 및 카운터로 작업 할 때 그것은 하나 오히려 일반적인 생각) 내 어휘 :

답변

3

만약을 개선하기 위해 그것을 알고 싶습니다이있는 경우 당신은 당신의 테이블에 AUTO_INCREMENT PRIMARY KEY를 추가 할 수있다.

제시 한 테이블 스키마가 유효하지 않습니다 (PRIMARY KEY on timestamp, 해당 열 없음).

이 될까요 우리 같은 경우

ALTER TABLE mytable DROP PRIMARY KEY, ADD COLUMN id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY 

? 그렇다면, 다음이 할 수 있다면

, 나는 단계로 제시합니다 :

SELECT 
    TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS diff_seconds, 
    m2.cnt - m1.cnt AS diff_cnt 
FROM 
    mytable m1 JOIN mytable m2 ON (m1.id = m2.id-1) 
; 

위는 시간과 연속 샘플 사이의 탄소 나노 튜브의 차이를 보여줍니다. 의 제 3 열을 추가하자

SELECT 
    TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS diff_seconds, 
    m2.cnt - m1.cnt AS diff_cnt, 
    (m2.cnt - m1.cnt)/TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS cnt_per_second 
FROM 
    mytable m1 JOIN mytable m2 ON (m1.id = m2.id-1) 
; 

내가 cnt_per_second을 평가 하였다. 분당 cnt를 얻기 위해 60을 곱합니다. 이제

은, 전체 평균은 다음과 같습니다 당신이 알고 싶다면
SELECT 
    avg(cnt_per_second) 
FROM (
    SELECT 
    TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS diff_seconds, 
    m2.cnt - m1.cnt AS diff_cnt, 
    (m2.cnt - m1.cnt)/TIMESTAMPDIFF(SECOND, m1.ts, m2.ts) AS cnt_per_second 
    FROM 
    mytable m1 JOIN mytable m2 ON (m1.id = m2.id-1) 
) sel_diff 
; 

가 첫 번째 쿼리에 원래 n1.ts 추가 는 DIFF을 기록 하였다, 그래서 당신도 알 수있을 것입니다 때 주어진 기간의 평균 카운트 이벤트.

+0

죄송합니다. 기본 키는 타임 스탬프의 줄임말 인'ts' 열에있었습니다. 여기저기서 쿼리를 작성하고 편집하는 동안 내 잘못. 나는 그 문제를 바로 잡기 위해 편집했고, 이제 나는 당신의 전체 답을 읽고 이해하는 데 시간을 할애 할 것이다. :) – Luke404

+0

그러면 해결책을 명확히하는 데 도움이 될 것입니다. 아이디어는 행 # 1을 행 # 2와 비교하고, 행 # 2를 행 # 3과 비교하는 것입니다. 두 행을 비교하면 시간에 차이가납니다. 그들은 또한 카운트의 차이를 만듭니다. 델타 (카운트)/델타 (시간)는 각 샘플에 대한 초당 평균 카운트입니다. –

+0

그래, 그걸 이해하고 나는 또한 당신의 솔루션을 테스트하고 적용했다. 고맙습니다. – Luke404