2017-05-09 1 views
0

헤이 사람 :SQL : Vertica의 고급 타임 슬라이스

+-----+------+----------+ 
| Tid | item | time_sec | 
+-----+------+----------+ 
| 1 | A |  1 | 
| 1 | B |  2 | 
| 1 | C |  4 | 
| 1 | D |  5 | 
| 1 | E |  6 | 
| 2 | A |  5 | 
| 2 | E |  5 | 
+-----+------+----------+ 

내 목표는 시간 창 델타 T 내에있는 새로운 항목 그룹을 만드는 것입니다 : 나는 Vertica의 DB에 다음과 같은 테이블이 있습니다. 첫 번째 항목과 마지막 항목의 타임 스탬프 사이의 차이가 deltaT보다 작거나 같은 것을 의미합니다. 예 : 델타 T = 2 초 우리가 새 테이블을 얻을 것이다 경우 : 먼저 우리는 TID 1로 모든 항목을 검사하고 TID의 1N과 하위 그룹을 만들 : 여기

+-----+------+ 
| Tid | item | 
+-----+------+ 
| 11 | A | 
| 11 | B | 
| 12 | B | 
| 12 | C | 
| 13 | C | 
| 13 | D | 
| 13 | E | 
| 14 | D | 
| 14 | E | 
| 15 | E | 
| 21 | A | 
| 21 | E | 
+-----+------+ 

은 테이블을 통해 거리에 있습니다 n은 카운터입니다. Tid 11이있는 첫 번째 하위 그룹은 항목 A, B로 구성됩니다. 마지막 항목과 첫 번째 항목 사이의 deltaT는 = <입니다. 2. 다음 그룹에는 항목 B, C가있는 Tid 12가 있습니다. 그 이후의 그룹은 모든 항목이 2 초의 시간 범위 내에 있기 때문에 Tid 13과 항목 C, D, E가 있습니다. 이것은 Tid 1을 가진 마지막 항목까지 계속됩니다. 우리가 Tid 2를 가진 그룹으로 다시 시작하는 것보다.

하위 그룹의 새로운 Tid 번호 매기기는 연속적 (1 ... 6) 일 수 있습니다. 원본 테이블과의 관계를 나타내는 종류의 번호 매기기.

저는 vertica 함수 LAG와 Time_slice를보고 있지만 이러한 문제를 우아하게 처리하는 방법을 알 수는 없습니다.

+0

나는 정말로 당신이 뭘하고 있는지 알지 못합니다. 필자는 실제로 입력 테이블에서 출력 테이블에 도달하는 논리를 파악할 수 없습니다. 예를 들어 시간이나 리터럴을 실제로 사용하지 않는다면 따라하기가 어렵습니다. 당신의 질문은 TIMESERIES 절 (사실 간격이없는 정기적으로 간격을 두는 timeseries를 생성하기 위해 실제로 새로운 행을 생성합니다)의 후보처럼 보이지만, 그것을 적용하는 몇 가지 방법을 시도했습니다. – marcothesane

+0

문제를 단어에 넣는 것은 그리 쉬운 일이 아닙니다. 조금이라도 다시 시도해 보겠습니다. – valenzio

답변

2

이것은 내가 얻은 것입니다. 실제로 질문에 대답하지 않습니다. 그러나 그것은 약간의 포인터를 구성 할 수 있습니다 :

WITH 
-- your input 
input(Tid,item,time_sec) AS (
      SELECT 1,'A',1 
UNION ALL SELECT 1,'B',2 
UNION ALL SELECT 1,'C',4 
UNION ALL SELECT 1,'D',5 
UNION ALL SELECT 1,'E',6 
UNION ALL SELECT 2,'A',5 
UNION ALL SELECT 2,'E',5 
) 
-- end of your input, start your "real" WITH clause here 
, 
input_w_ts AS (
    SELECT 
    * 
    , TIMESTAMPADD('SECOND',time_sec-1,TIMESTAMP '2000-01-01 00:00:00') AS ts 
    FROM input 
) 
SELECT 
    TS_LAST_VALUE(Tid) AS Tid 
, item 
, TS_LAST_VALUE(time_sec) AS time_sec 
, tsr 
FROM input_w_ts 
TIMESERIES tsr AS '2 SECONDS' OVER (PARTITION BY item ORDER BY ts) 
ORDER BY 1,4 
; 
Output: 
Tid|item|time_sec|tsr 
    1|A |  1|2000-01-01 00:00:00 
    1|B |  2|2000-01-01 00:00:00 
    1|A |  1|2000-01-01 00:00:02 
    1|C |  4|2000-01-01 00:00:02 
    1|D |  5|2000-01-01 00:00:04 
    1|E |  6|2000-01-01 00:00:04 
    2|A |  5|2000-01-01 00:00:04