2014-02-20 1 views
3

테이블에 시계열 데이터가 있습니다. 기본적으로 각 행에는 타임 스탬프와 값이 있습니다. 데이터의 빈도는 절대적으로 무작위입니다.하이브 QL로 시간 간격에 따른 샘플 시간 세리 및 점프 계산

주어진 주파수로 샘플링하고 각 주파수에 대해 관련 정보를 추출하고 싶습니다. 최소, 최대, 최종, 변경 (상대적 이전), 반환 (변경/이전) 및 더 많은 것 (개수 .. .)

그래서 여기 내 입력의 :

08:00:10, 1 
08:01:20, 2 
08:01:21, 3 
08:01:24, 5 
08:02:24, 2 

그리고 1 개 샘플링 (TS, 최소, 최대, 마지막, 변경, 창)에 대한 다음과 같은 결과를 얻을 싶습니다

ts  m M L Chg Return 
08:01:00, 1, 1, 1, NULL, NULL 
08:02:00, 2, 5, 5, 4, 4 
08:03:00, 2, 2, 2, -3, -0.25 

답변

1

Y

SELECT 
    min 
    , mn 
    , mx 
    , l 
    , l - LAG(l, 1) OVER (ORDER BY min) c 
    -- This might not be the right calculation. Unsure how -0.25 was derived in question. 
    , (l - LAG(l, 1) OVER (ORDER BY min))/(LAG(l, 1) OVER (ORDER BY min)) r 
FROM 
(
    SELECT 
     min 
    , MIN(val) mn 
    , MAX(val) mx 
    -- We can take MAX here because all l's (last values) for the minute are the same. 
    , MAX(l) l 
    FROM 
    (
    SELECT 
     min 
     , val 
     -- The last value of the minute, ordered by the timestamp, using all rows. 
     , LAST_VALUE(val) OVER (PARTITION BY min ORDER BY ts ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) l 
    FROM 
    (
     SELECT 
      ts 
     -- Drop the seconds and go back one minute by converting to seconds, 
     -- subtracting 60, and then going back to a shorter string format. 
     -- 2000-01-01 is a dummy date just to enable the conversion. 
     , CONCAT(FROM_UNIXTIME(UNIX_TIMESTAMP(CONCAT("2000-01-01 ", ts), "yyyy-MM-dd HH:mm:ss") + 60, "HH:mm"), ":00") min  
     , val 
     FROM 
     -- As from the question. 
     21908430_input a 
    ) val_by_min 
) val_by_min_with_l 
    GROUP BY min 
) min_with_l_m_M 
ORDER BY min 
; 

결과 :

+----------+----+----+---+------+------+ 
| min  | mn | mx | l | c | r | 
+----------+----+----+---+------+------+ 
| 08:01:00 | 1 | 1 | 1 | NULL | NULL | 
| 08:02:00 | 2 | 5 | 5 | 4 | 4 | 
| 08:03:00 | 2 | 2 | 2 | -3 | -0.6 | 
+----------+----+----+---+------+------+ 
OU이 (코멘트 인라인) 같은 것을 함께 할 수