2017-10-26 10 views
0

는 내가 가진이슬라이딩 윈도우 집계 빅 쿼리로 15 분 집계

행 시간 조회수
1 0시 0분 0초 31
2 0시 0분 1초 44
3 0시 0분 2초 같은 테이블 78
4 0시 0분 3초 71
5 0시 0분 4초 72
6 0시 0분 5초 73
7 0시 0분 6초 64
8 0시 0분 7초 70

I는 이것을 응집하려는

행 타임 조회수
1 0시 0분 0초 31
2 0시 15분 0초 445
3 0시 30분 0초 700
0시 45분 4 : 00 500
5 01:00:04 121
6 01:15:00 475 . . .

도와주세요. 사전

다음

답변

0

감사드립니다 BigQuery에 표준 SQL

주입니다 : 당신은 당신의 데이터의 간단한 예를 제공하고 아래에 다음 - 그래서 대신에 각 15 분 집계에, 각 2 초 집계를 사용합니다. 이것은 당신이 쉽게 테스트/재생할 수 있도록하기위한 것입니다. SECOND을 3 곳에서 MINUTE, 2에서 15까지 3 곳으로 변경하여 15 분으로 쉽게 조정할 수 있습니다. 또한이 예에서는 시간 필드에 TIME 데이터 유형을 사용하므로 예제에서는 24 시간으로 제한됩니다. 실제 데이터에는 DATETIME 또는 TIMESTAMP 일 가능성이 큽니다.

#standardSQL 
WITH `project.dataset.table` AS (
    SELECT TIME '00:00:00' time, 31 viewCount UNION ALL 
    SELECT TIME '00:00:01', 44 UNION ALL 
    SELECT TIME '00:00:02', 78 UNION ALL 
    SELECT TIME '00:00:03', 71 UNION ALL 
    SELECT TIME '00:00:04', 72 UNION ALL 
    SELECT TIME '00:00:05', 73 UNION ALL 
    SELECT TIME '00:00:06', 64 UNION ALL 
    SELECT TIME '00:00:07', 70 
), 
period AS (
    SELECT MIN(time) min_time, MAX(time) max_time, TIME_DIFF(MAX(time), MIN(time), SECOND) diff 
    FROM `project.dataset.table` 
), 
checkpoints AS (
    SELECT TIME_ADD(min_time, INTERVAL step SECOND) start_time, TIME_ADD(min_time, INTERVAL step + 2 SECOND) end_time 
    FROM period, UNNEST(GENERATE_ARRAY(0, diff + 2, 2)) step 
) 
SELECT start_time time, SUM(viewCount) viewCount 
FROM checkpoints c 
JOIN `project.dataset.table` t 
ON t.time >= c.start_time AND t.time < c.end_time 
GROUP BY start_time 
ORDER BY start_time, time 

및 결과는 다음과 같습니다 : -이 경우 당신은 또한 각각의 DATETIME_* 또는 TIMESTAMP_* 기능

모든 TIME_* 기능을 교체해야합니다 것은 그래서, 마지막으로 쿼리는

Row time  viewCount  
1 00:00:00 75 
2 00:00:02 149 
3 00:00:04 145 
4 00:00:06 134 
+0

내 경험에 의하면 해결책을 주셔서 감사합니다 – sarath

0

것을 가정하면 실제로 TIMESTAMP 열이 있다면 다음과 같은 접근 방식을 사용할 수 있습니다.

#standardSQL 
SELECT 
    TIMESTAMP_SECONDS(
    UNIX_SECONDS(timestamp) - 
    MOD(UNIX_SECONDS(timestamp), 15 * 60) 
) AS time, 
    SUM(viewCount) AS viewCount 
FROM `project.dataset.table` 
GROUP BY time; 

15 분 간격을 계산하기 위해 Unix 초 단위로의 변환에 의존합니다. Mikhail의 솔루션과 달리 빈 15 분 간격으로 0이 포함 된 행을 생성하지는 않습니다 (이것이 중요한지 확실하지 않습니다).

+0

- 이러한 유형의 분석에는 간격 채우기가 중요합니다. –

+0

해결책 주셔서 감사합니다 – sarath